Django(request和response)
原文連結: https://blog.csdn.net/weixin_31449201/article/details/81043326
Django中的請求與響應
一.請求request
django中的request用來獲取前端傳過來的資料,那麼前端資料的傳送方式有多種,每一種傳輸方式在後端對應的接收方式也不同,所以我們首先來看前端的幾種資料傳送方式:
1.url路徑引數
對於這種資料,它在前端的url中,比如:www.baidu.com/id/
我們就可以獲取這個url中的id
方法:
在定義好的檢視函式或者檢視類的函式中的引數加上這個id即可
比如:
def weather(request, id): print('id=%s' % id) return HttpResponse('OK')
2.查詢字串
什麼是查詢字串?看下邊的例子就好
www.baidu.com/data/?a=10&b=20&a=30 (這個路徑中有兩個a,因為前端有時會有一鍵多值的情況)
對於這種請求怎麼獲取a,b這兩個資料呢
我們可以通過request.GET屬性來獲取(HttpRequest物件的屬性GET、POST都是QueryDict型別的物件,通過QueryDict物件request.GET/request.POST來獲取一鍵多值的資料)
重要:查詢字串不區分請求方式,即假使客戶端進行POST方式的請求,依然可以通過request.GET獲取請求中的查詢字串資料。
方法:
def qs(request):
a = request.GET.get('a')
b = request.GET.get('b')
alist = request.GET.getlist('a')
print(a) # 30
print(b) # 20
print(alist) # ['10', '30']
return HttpResponse('OK')
3.請求體裡邊的資料
請求體資料格式不固定,可以是表單型別字串,可以是JSON字串,可以是XML字串,應區別對待。
可以傳送請求體資料的請求方式有POST、PUT、PATCH、DELETE。
Django預設開啟了CSRF防護,會對上述請求方式進行CSRF防護驗證,在測試時可以關閉CSRF防護機制,方法為在settings.py檔案中註釋掉CSRF中介軟體
①表單資料
表單資料的獲取通過request.POST返回的Query Dict物件來獲取
注意:request.POST只能用來獲取POST方式的請求體表單資料。
方法:request.POST.get()和request.POST.getlist()
如:
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')
②非表單資料
非表單型別的請求體資料,Django無法自動解析,可以通過request.body屬性獲取最原始的請求體資料,自己按照請求體格式(JSON、XML等)進行解析。
request.body返回bytes型別。
例如要獲取請求體中的如下JSON資料
{"name": "fenghua", "age": 24}
方法:因為獲取到的是原始二進位制資料,要進行解碼(字串化,得到json資料),json_dict化(將json資料轉換成字典)
例如:
import json
def get_body_json(request):
json_str = request.body
json_str = json_str.decode() # python3.6 無需執行此步
req_data = json.loads(json_str)
print(req_data['name'])
print(req_data['age'])
return HttpResponse('OK')
4.請求頭裡邊的資料
可以通過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['REQUEST_METHOD'])
return HttpResponse('haha')
5.其他常用請求物件
method:一個字串,表示請求使用的HTTP方法,常用值包括:'GET'、'POST'。
user:請求的使用者物件。
path:一個字串,表示請求的頁面的完整路徑,不包含域名和引數部分。
encoding:一個字串,表示提交的資料的編碼方式。
如果為None則表示使用瀏覽器的預設設定,一般為utf-8。
這個屬性是可寫的,可以通過修改它來修改訪問表單資料使用的編碼,接下來對屬性的任何訪問將使用新的encoding值。
FILES:一個類似於字典的物件,包含所有的上傳檔案。
二.響應response
響應的常見型別:
HttpResponse,
HttpResponse子類(如HttpResponseNotFound 404),
JsonResponse,
redirect重定向,
render
1.HttpResponse
響應頭的新增:得使用響應物件
response = HttpResponse()
response['name'] = ‘fenghua'
響應體的新增:
方式1:直接返回
return HttpResponse(content=響應體, content_type=響應體資料型別, status=狀態碼)
方式2:構造響應物件
response = HttpResponse(響應體)
response.status_code = 狀態碼
return response
2.HttpResponse子類
# 直接返回404錯誤狀態碼
def http_response(request):
return HttpResponseNotFound(響應體內容) # 返回的狀態碼自動設定成404,並顯示前端顯示的資料
3.JsonResponse
返回json格式資料,並將響應頭的Content-Type設定成application/json
# 響應json資料到前端
def response_json(request):
data_json = {"name": "fenghua", "age": 24}
# 預設把json_dict轉成了json字串
# 再預設把json字串轉成二進位制的json字串
# 預設將資料型別指定為 application/json
return JsonResponse(data_json)
4.redirect重定向
反向解析reverse:根據路由名稱或者名稱空間解析出url路徑
反向解析:要是名稱空間是以分離的方式:url(r'^users/', include('users.urls', namespace='users111'))
url(r'^index/$', views.index, name='index111')
則reverse方式為:reverse('users111:index111')
或者:reverse('users:index')
要是以一次性在主url寫好的方式:url(r'^users/feng', views.feng, name='feng')
則reverse方式為:reverse('feng')
redirect:根據反向解析出來的路徑進行重定向
具體使用如下:
# 需求:訪問'response_redirect/'重定向到 'users.index'
def response_redirect(request):
# url(r'^users/', include('users.urls', namespace='users111'))
# url(r'^index/$', views.index, name='index111')
return redirect(reverse('users:index')) # redirect(reverse('users111:index111')) 也可以實現
5.render返回模板
用法:
render(request物件, 模板檔案路徑, 模板資料字典)
from django.shortcuts import render
def index(request):
context={'city': '北京'}
return render(request,'index.html',context)