HTTP請求對象
網站時根據用戶請求來輸出相應的響應內容,用戶請求是指用戶在瀏覽器上訪問某個網址鏈接操作,瀏覽器會根據網址鏈接信息向網站發送HTTP請求,那麼,當Django接收到用戶請求時,它是如何獲取用戶請求信息的呢?
1、 獲取請求信息
當在瀏覽器上訪問某個網址時,其實質時向網站發送一個HTTP請求,HTTP請求分爲8種請求方式,每種請求方式的說明如下:
請求方式 | 說明 |
---|---|
OPTIONS | 返回服務器針對特定資源所支持的請求方法 |
GET | 向特定資源發出請求(訪問網頁) |
POST | 向指定資源提交數據處理請求(提交表單、上傳文件) |
PUT | 向指定資源位置上傳數據內容跟 |
DELETE | 請求服務器刪除request-URL所標示的資源 |
HEAD | 與GET請求類似,返回的響應中沒有具體內容,用於獲取報頭 |
TRACE | 回覆和顯示服務器收到的請求,用於測試和診斷 |
CONNECT | HTTP/1.1協議中能夠將連接改爲管道方式的代理服務器 |
在上述的HTTP的請求方式裏,最基本的時GET請求和POST請求,網站開發者關心的也只有GET請求和POST請求。GET請求和POST請求是可以設置請求參數的,兩者的設置方式如下:
- GET請求的請求參數是在路由地址後添加"?“和參數內容,參數內容以key=value形式表示,等號前面的是參數名,後面是參數值,如果涉及多個參數,每個參數之間舊使用”&"隔開,如127.0.0.1:8000/?user=xy&pw=123.
- POST請求的請求參數一般以表單的形式傳遞,常見的額表單使用HTML的form標籤,並且form標籤的method屬性設爲POST。
2、文件上傳功能
文件上傳功能是網站開發常見的功能之一,比如上傳圖片和導入(音頻文件、辦公文件或安裝包等)。無論上傳的文件是什麼格式的,其上傳原理都是將文件二進制的數據格式讀取並寫入網站指定的文件夾裏。通過一個簡單的例子來使用Django實現文件上傳功能。
# index的urls.py
from django.urls import path
from . import views
urlpatterns = [
# 定義路由
path('', views.upload, name='uploaded'),
]
# index的views.py
from django.shortcuts import render
from django.http import HttpResponse
import os
def upload(request):
# 請求方法爲POST時,執行文件上存
if request.method == "POST":
# 獲取上傳的文件,如果沒有文件,則默認爲None
myFile = request.FILES.get("myfile", None)
if not myFile:
return HttpResponse("no files for upload!")
# 打開特定的文件進行二進制的寫操作
f = open(os.path.join("D:\\upload", myFile.name), 'wb+')
# 分塊寫入文件
for chunk in myFile.chunks():
f.write(chunk)
f.close()
return HttpResponse("upload over!")
else:
# 請求方法爲GET時,生成文件上存頁面
return render(request, 'upload.html')
# templates的upload.html
<!DOCTYPE html>
<html>
<body>
<form enctype="multipart/form-data" action="" method="post">
{% csrf_token %}
<input type="file" name="myfile" />
<br>
<input type="submit" value="上存文件"/>
</form>
</body>
</html>
從視圖函數upload可以看到,如果當前HTTP請求爲POST,就會觸發文件上傳功能。其運行過程如下:
- 模板文件upload.html使用from標籤的文件控件file生成文件上傳功能,該控件將用戶上傳的文件以二進制讀取,讀取方式由form標籤的屬性enctype="multipart/form-data"設置。
- 瀏覽器將用戶上傳的文件讀取後,通過HTTP的POST請求將二進制數據傳到Django,當Django收到POST請求後,從請求對象的屬性FILES獲取文件信息,然後再D盤的upload文件夾裏創建新的文件,文件名(從文件信息對象myFile.name獲取)與用戶上傳的文件名相同。
- 從文件信息對象myFile.chunks()讀取文件內容,並寫入upload文件夾的文件中,從而實現文件上傳功能。