天天看點

django中請求的6種方法

請求

回想一下,利用HTTP協定向伺服器傳參有幾種途徑?

提取URL的特定部分,如/weather/beijing/2018,可以在伺服器端的路由中用正規表達式截取;

查詢字元串(query string),形如key1=value1&key2=value2;

請求體(body)中發送的資料,比如表單資料、json、xml;

在http封包的頭(header)中。

1 URL路徑參數

在定義路由URL時,可以使用正規表達式提取參數的方法從URL中擷取請求參數,Django會将提取的參數直接傳遞到視圖的傳入參數中。

未命名參數按定義順序傳遞, 如

url(r’^weather/([a-z]+)/(\d{4})/$’, views.weather),

def weather(request, city, year):

print(‘city=%s’ % city)

print(‘year=%s’ % year)

return HttpResponse(‘OK’)

命名參數按名字傳遞,如

url(r’^weather/(?P[a-z]+)/(?P\d{4})/$’, views.weather),

def weather(request, year, city):

print(‘city=%s’ % city)

print(‘year=%s’ % year)

return HttpResponse(‘OK’)

2 Django中的QueryDict對象

定義在django.http.QueryDict

HttpRequest對象的屬性GET、POST都是QueryDict類型的對象

與python字典不同,QueryDict類型的對象用來處理同一個鍵帶有多個值的情況

方法get():根據鍵擷取值

如果一個鍵同時擁有多個值将擷取最後一個值

如果鍵不存在則傳回None值,可以設定預設值進行後續處理

dict.get(‘鍵’,預設值)

可簡寫為

dict[‘鍵’]

方法getlist():根據鍵擷取值,值以清單傳回,可以擷取指定鍵的所有值

如果鍵不存在則傳回空清單[],可以設定預設值進行後續處理

dict.getlist(‘鍵’,預設值)

3. 查詢字元串Query String

擷取請求路徑中的查詢字元串參數(形如?k1=v1&k2=v2),可以通過request.GET屬性擷取,傳回QueryDict對象。

def qs(request):

a = request.GET.get(‘a’)

b = request.GET.get(‘b’)

alist = request.GET.getlist(‘a’)

print(a) # 3

print(b) # 2

print(alist) # [‘1’, ‘3’]

return HttpResponse(‘OK’)

重要:查詢字元串不區分請求方式,即假使用戶端進行POST方式的請求,依然可以通過request.GET擷取請求中的查詢字元串資料。

4 請求體

請求體資料格式不固定,可以是表單類型字元串,可以是JSON字元串,可以是XML字元串,應差別對待。

可以發送請求體資料的請求方式有POST、PUT、PATCH、DELETE。

Django預設開啟了CSRF防護,會對上述請求方式進行CSRF防護驗證,在測試時可以關閉CSRF防護機制,方法為在settings.py檔案中注釋掉CSRF中間件,如:

django中請求的6種方法

注釋CSRF中間件

4.1 表單類型 Form Data

前端發送的表單類型的請求體資料,可以通過request.POST屬性擷取,傳回QueryDict對象。

def get_body(request):

a = request.POST.get(‘a’)

b = request.POST.get(‘b’)

alist = request.POST.getlist(‘a’)

print(a)

print(b)

print(alist)

return HttpResponse(‘OK’)

重要:隻要請求體的資料是表單類型,無論是哪種請求方式(POST、PUT、PATCH、DELETE),都是使用request.POST來擷取請求體的表單資料。

4.2 非表單類型 Non-Form Data

非表單類型的請求體資料,Django無法自動解析,可以通過request.body屬性擷取最原始的請求體資料,自己按照請求體格式(JSON、XML等)進行解析。request.body傳回bytes類型。

例如要擷取請求體中的如下JSON資料

{“a”: 1, “b”: 2}

可以進行如下方法操作:

import json

def get_body_json(request):

json_str = request.body

req_data = json.loads(json_str)

print(req_data[‘a’])

print(req_data[‘b’])

return HttpResponse(‘OK’)

5 請求頭

可以通過request.META屬性擷取請求頭headers中的資料,request.META為字典類型。

常見的請求頭如:

CONTENT_LENGTH – The length of the request body (as a string).

CONTENT_TYPE – The MIME type of the request body.

HTTP_ACCEPT – Acceptable content types for the response.

HTTP_ACCEPT_ENCODING – Acceptable encodings for the response.

HTTP_ACCEPT_LANGUAGE – Acceptable languages for the response.

HTTP_HOST – The HTTP Host header sent by the client.

HTTP_REFERER – The referring page, if any.

HTTP_USER_AGENT – The client’s user-agent string.

QUERY_STRING – The query string, as a single (unparsed) string.

REMOTE_ADDR – The IP address of the client.

REMOTE_HOST – The hostname of the client.

REMOTE_USER – The user authenticated by the Web server, if any.

REQUEST_METHOD – A string such as “GET” or “POST”.

SERVER_NAME – The hostname of the server.

SERVER_PORT – The port of the server (as a string).

具體使用如:

def get_headers(request):

print(request.META[‘CONTENT_TYPE’])

return HttpResponse(‘OK’)

6 其他常用HttpRequest對象屬性

method:一個字元串,表示請求使用的HTTP方法,常用值包括:‘GET’、‘POST’。

user:請求的使用者對象。

path:一個字元串,表示請求的頁面的完整路徑,不包含域名和參數部分。

encoding:一個字元串,表示送出的資料的編碼方式。

如果為None則表示使用浏覽器的預設設定,一般為utf-8。

這個屬性是可寫的,可以通過修改它來修改通路表單資料使用的編碼,接下來對屬性的任何通路将使用新的encoding值。

FILES:一個類似于字典的對象,包含所有的上傳檔案。