django中的HTTP檢視接受請求的過程和request物件的呼叫
阿新 • • 發佈:2021-07-04
在http請求和響應過程中, 使用者往往會在請求過程中傳送請求資訊給服務端. 1. 查詢字串[Query String] 所謂的查詢字串就是url地址上面?號後面的資料,例如: http://127.0.0.1:8000/index?name=xiaoming&pwd=123456 上面name=xiaoming&pwd=123456就是查詢字串 可以通過 request.GET 來獲取,注意: GET不是http請求,也就是說,只要地址上有查詢字串,都可以獲取
request.GET //<QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678']}>獲取到的是通過request得到的客戶端請求資料,基本都是會儲存成QueryDict類字典給檢視的
獲取引數的一個值,或者第一個值
request.GET.get("name") //因為QueryDict是一個偽字典物件,所以可以通過get或者中括號獲取到資料
request.GET["name"])
request.GET.getlist("lve") //# ['swimming', 'shopping', 'game']獲取多個值
request.GET['lve'] // # 如果字典的值是個列表多個值時,使用[""]字典方式獲取多個值值時,後面的值覆蓋了前面的值
request.POST //獲取請求體資料,返回資料結果是QueryDict,只能過去表單資料
request.body //獲取請求體資料,返回的事二進位制位元組流,可以接受Json原生資料和其他格式的資料
request.META//獲取請求頭資料
request.FILES //獲取上傳檔案 返回<MultiValueDict>字典物件
HTTP協議:
請求首行:
請求方式、url路徑、HTTP協議版本
請求頭:
常見的請求頭有:
Content-Type:文字的資料型別
User-Agent:產生請求的瀏覽器型別
Host:傳送請求的主機名
Accept:返回的資料格式
Server、Cookie等等。
請求體:
常見的請求方式:get、post、put、delete等
獲取請求行檢視程式碼:
"""查詢字串[Query String]""" def index3(request): print(request.GET) """ 訪問地址: http://127.0.0.1:8000/home/index3 列印效果: <QueryDict: {}> 分析: 通過request得到的客戶端請求資料,基本都是會儲存成QueryDict類字典給檢視的,上面是空字典 QueryDict的宣告位置: from django.http import QueryDict QueryDict的父類繼承的就是dict字典,所以字典提供的方法或者操作, QueryDict都有 """ """ 訪問地址: http://127.0.0.1:8000/home/index3?name=xiapming&mobile=13312345678 列印效果: <QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678']}> 分析: 這次就獲取到了name和mobile引數以及引數的值 注意: 因為客戶端傳遞過來的引數有可能多個值的情況,所以查詢字串返回的資料值都是列表格式 """ """ 訪問地址: http://127.0.0.1:8000/home/index3?name=xiapming&mobile=13312345678&lve=swimming&lve=shopping&lve=game 列印效果: <QueryDict: {'name': ['xiapming'], 'mobile': ['13312345678'], 'lve': ['swimming', 'shopping', 'game']}> 分析: 因為lve有多個值的存在, 所以值就是列表中有3個成員 """ """獲取QueryDict物件中的引數值""" # 獲取引數的一個值,或者第一個值 # 因為QueryDict是一個偽字典物件,所以可以通過get或者中括號獲取到資料 # print(request.GET.get("name")) # print(request.GET["name"]) # 獲取引數的所有值 print(request.GET.getlist("lve")) # ['swimming', 'shopping', 'game'] print(request.GET['lve']) # game,後面的值覆蓋了前面的值
路由程式碼:
from django.urls import path from . import views urlpatterns = [ path("index", views.index ), path("index2", views.index2 ), path("index3", views.index3 ), ]
獲取請求體資料的試圖程式碼:
def index4(request): """獲取請求體資料,返回資料結果是QueryDict""" print(request.POST) """ 列印效果: <QueryDict: {'name': ['root'], 'password': ['123456']}> """ print(request.body) # b'{\n\t"title": "\xe5\x9c\xa3\xe8\xaf\x9e\xe6\xa0\x91",\n "username":"\xe5\x9c\xa3\xe8\xaf\x9e\xe8\x80\x81\xe5\xa4\xb4",\n "age": 1200\n}' """ 列印效果: b'{\n\t"title": "\xe5\x9c\xa3\xe8\xaf\x9e\xe6\xa0\x91",\n "username":"\xe5\x9c\xa3\xe8\xaf\x9e\xe8\x80\x81\xe5\xa4\xb4",\n "age": 1200\n}' """ import json ret = json.loads(request.body) print(ret) # {'title': '聖誕樹', 'username': '聖誕老頭', 'age': 1200} return HttpResponse("ok")
django中的request.POST只能取到Content-Type(請求頭)為application/x-www-form-urlencoded(form表單預設格式)的資料,如果請求頭為application/json(json格式),multipart/form-data(檔案)等格式無法取到,只有在request.body裡面能取到原生的資料。當傳送過來的是JSON資料是,request.POST取到的資料是空的,這時只有用request.body取,再反序列化才能使用。
獲取請求體資料的路由程式碼:
from django.urls import path
from . import views
urlpatterns = [
path("index", views.index ),
path("index2", views.index2 ),
path("index3", views.index3 ),
path("index4", views.index4 ),
]
獲取請求頭資料:
def index4(request): """獲取請求頭資訊""" print( request.META.get("CONTENT_TYPE") ) # application/json """獲取自定義請求頭""" print( request.META.get("HTTP_COMPANY")) # oldboyedu return HttpResponse("ok")