1. 程式人生 > 其它 >django中的HTTP檢視接受請求的過程和request物件的呼叫

django中的HTTP檢視接受請求的過程和request物件的呼叫

檢視接收http請求

在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")