1. 程式人生 > >Django(request和response)

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)