欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python Django請(qǐng)求和響應(yīng)對(duì)象詳解

 更新時(shí)間:2021年11月01日 11:58:13   作者:zy010101  
這篇文章主要給大家介紹了關(guān)于django的請(qǐng)求和響應(yīng)對(duì)象,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Django請(qǐng)求和響應(yīng)對(duì)象

Django 使用請(qǐng)求和響應(yīng)對(duì)象在系統(tǒng)中傳遞狀態(tài)。

當(dāng)一個(gè)頁(yè)面被請(qǐng)求時(shí),Django 會(huì)創(chuàng)建一個(gè) HttpRequest 對(duì)象,這個(gè)對(duì)象包含了請(qǐng)求的元數(shù)據(jù)。然后,Django 加載相應(yīng)的視圖,將 HttpRequest 作為視圖函數(shù)的第一個(gè)參數(shù)。每個(gè)視圖負(fù)責(zé)返回一個(gè) HttpResponse 對(duì)象。

HttpRequest對(duì)象

下面介紹HttpRequest對(duì)象常用的屬性和方法。

HttpRequest常用屬性

1.HttpRequest.body

原始的 HTTP 請(qǐng)求體作為一個(gè)字節(jié)字符串。這對(duì)于以不同方式處理非常規(guī) HTML 表單的數(shù)據(jù)很有用:二進(jìn)制圖像,XML 有效負(fù)載等。對(duì)于處理傳統(tǒng)的表單數(shù)據(jù),使用 HttpRequest.POST

2.HttpRequest.method

代表請(qǐng)求中使用的 HTTP 方法的字符串,一定是大寫(xiě)字母。

3.HttpRequest.GET

一個(gè)類似字典的對(duì)象,包含所有給定的 HTTP GET 參數(shù)。

4.HttpRequest.POST

一個(gè)類似字典的對(duì)象,包含所有給定的 HTTP POST 參數(shù),前提是請(qǐng)求包含表單數(shù)據(jù)。如果你需要訪問(wèn)請(qǐng)求中發(fā)布的原始或非表單數(shù)據(jù),可以通過(guò) HttpRequest.body 屬性來(lái)訪問(wèn)。

以上的4個(gè)屬性是我們最常用的HttpRequest屬性。結(jié)合實(shí)際,我們可能寫(xiě)出的代碼如下:

if request.method == "POST":        # POST請(qǐng)求方法
    try:
        data = json.loads(request.body)     # 獲取POST請(qǐng)求攜帶的非表單數(shù)據(jù)(JSON數(shù)據(jù))
    except json.JSONDecodeError:
        return JsonResponse({"status": "1", "msg": "數(shù)據(jù)格式錯(cuò)誤"})
    # 表單數(shù)據(jù)
    # keys = request.POST.get("keys")       # 如果POST攜帶的是表單數(shù)據(jù),可以這樣獲取。
elif request.method == "GET":
    keys = request.GET.get("keys")      # 獲取get請(qǐng)求攜帶的參數(shù)
    return JsonResponse({"status": "0", "msg": "請(qǐng)求成功"})
else:
    return JsonResponse({"status": "0", "msg": "請(qǐng)求方法錯(cuò)誤"})

5.HttpRequest.COOKIES

一個(gè)包含所有 cookies 的字典。鍵和值是字符串。

6.HttpRequest.FILES

一個(gè)類似字典的對(duì)象,包含所有上傳的文件。FILES 中的每個(gè)鍵是<input type="file" name=""> 中的 name。FILES 中的每個(gè)值是一個(gè) UploadedFile。

FILES 只有在請(qǐng)求方法是 POST,并且發(fā)布請(qǐng)求的<form>有 enctype=“multipart/form-data” 的情況下,才會(huì)包含數(shù)據(jù)。否則,F(xiàn)ILES 將是一個(gè)類似字典的空白對(duì)象。

7.HttpRequest.META

一個(gè)包含所有可用的 HTTP 頭文件的字典??捎玫念^信息取決于客戶端和服務(wù)器。一些可能的例子如下:

1.CONTENT_LENGTH —— 請(qǐng)求體的長(zhǎng)度(字符串)。

2.CONTENT_TYPE —— 請(qǐng)求體的 MIME 類型。

3.HTTP_ACCEPT —— 可接受的響應(yīng)內(nèi)容類型。

4.HTTP_ACCEPT_ENCODING —— 可接受的響應(yīng)編碼。

5.HTTP_ACCEPT_LANGUAGE —— 可接受的響應(yīng)語(yǔ)言。

6.HTTP_HOST —— 客戶端發(fā)送的 HTTP 主機(jī)頭。

7.HTTP_REFERER —— referrer 頁(yè)面,如果有的話。

8.HTTP_USER_AGENT —— 客戶端的用戶代理字符串。

9.QUERY_STRING —— 查詢字符串,是一個(gè)單一的(未解析的)字符串。

10.REMOTE_ADDR —— 客戶機(jī)的 IP 地址。

11.REMOTE_HOST —— 客戶機(jī)的主機(jī)名。

12.REMOTE_USER —— Web 服務(wù)器認(rèn)證的用戶,如果有的話。

13.REQUEST_METHOD —— “GET” 或 “POST” 等字符串。

14.SERVER_NAME —— 服務(wù)器的主機(jī)名。

15.SERVER_PORT —— 服務(wù)器的端口(字符串)。

請(qǐng)求中的任何 HTTP 頭都會(huì)被轉(zhuǎn)換為 META 鍵,方法是將所有字符轉(zhuǎn)換為大寫(xiě)字母,用下劃線代替任何連字符,并在名稱前加上 HTTP_` 前綴。例如,請(qǐng)求頭里的X-CSRFToken在META中變?yōu)镠TTP_X_CSRFTOKEN.

中間件設(shè)置的屬性

Django 的 contrib 應(yīng)用中包含的一些中間件會(huì)在請(qǐng)求中設(shè)置屬性。

1.HttpRequest.session

來(lái)自 SessionMiddleware。一個(gè)可讀可寫(xiě)的,類似字典的對(duì)象,代表當(dāng)前會(huì)話。

2.HttpRequest.user

從 AuthenticationMiddleware。AUTH_USER_MODEL 的一個(gè)實(shí)例,代表當(dāng)前登錄的用戶。如果用戶當(dāng)前沒(méi)有登錄,user 將被設(shè)置為一個(gè) AnonymousUser 的實(shí)例。你可以用 is_authenticated 來(lái)區(qū)分它們,例如:

if request.user.is_authenticated:
    ... # Do something for logged-in users.
else:
    ... # Do something for anonymous users.

如果使用Nginx+uWsgi的方式部署Django項(xiàng)目,那么META中的REMOTE_ADDR,REMOTE_HOST等不正確的,因?yàn)橥ㄟ^(guò)Nginx代理轉(zhuǎn)發(fā)到uWsgi監(jiān)聽(tīng)的端口,這時(shí)候應(yīng)用程序獲取的客戶端信息就是127.0.0.1的本機(jī)信息,而不是真實(shí)客戶端的信息。因此,需要在Nginx中添加如下參數(shù):

uwsgi_param  Host $host;
uwsgi_param  X-Real-IP $remote_addr;
uwsgi_param  X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param  X-Forwarded-Proto $http_x_forwarded_proto;

至于你需要的到底是X-Real-IP還是X-Forwarded-For,取決于你的業(yè)務(wù)邏輯。

QueryDict對(duì)象

在一個(gè) HttpRequest 對(duì)象中, GET 和 POST 屬性是 django.http.QueryDict 的實(shí)例,這是一個(gè)類似字典的類,用來(lái)處理同一個(gè)鍵的多個(gè)值。這是很有必要的,因?yàn)橐恍?HTML 表單元素,尤其是<select multiple>,會(huì)傳遞同一個(gè)鍵的多個(gè)值。

在 request.POST 和 request.GET 中的 QueryDict 將在正常的請(qǐng)求/響應(yīng)周期中被訪問(wèn)時(shí)是不可改變的。要得到一個(gè)可變的版本,你需要使用 QueryDict.copy()。

QueryDict方法

QueryDict是字典的子類,因此字典有的標(biāo)準(zhǔn)方法,QueryDict都具備。

1.QueryDict.get(key, default=None)

 如果鍵不存在,則用鉤子返回一個(gè)默認(rèn)值。如果鍵有多個(gè)值,則會(huì)獲取到最后一個(gè)值。

2.QueryDict.getlist(key, default=None)

 返回帶有請(qǐng)求鍵的數(shù)據(jù)列表。如果鍵不存在且 default 是 None,則返回一個(gè)空列表。除非提供的默認(rèn)值不是一個(gè)列表,否則返回一個(gè)列表。

下面是一段代碼,展示了get和getlist的使用。

>>> qd = QueryDict('a=1&a=2&a=3&b=4')  # 構(gòu)造QueryDict對(duì)象qd
>>> qd.get('a')         # 獲取鍵a的最后一個(gè)值
'3'
>>> qd.getlist('a')     # 獲取鍵a的所有值
['1', '2', '3']
>>> qd
<QueryDict: {'a': ['1', '2', '3'], 'b': ['4']}>
>>> qd.getlist('c')
[]
>>> qd.getlist('c', [1,2])
[1, 2]
>>> qd.get('c', '5')
'5'

HttpResponse對(duì)象

Django會(huì)自動(dòng)創(chuàng)建HttpRequest(wsgi或者asgi創(chuàng)建)對(duì)象, HttpResponse則是后端開(kāi)發(fā)人員負(fù)責(zé)實(shí)例化、填充和返回。每一個(gè)視圖函數(shù)都必須返回一個(gè)HttpResponse對(duì)象。

HttpResponse類位于django.http模塊中。

HttpResponse對(duì)象用法

典型的用法是將頁(yè)面的內(nèi)容以字符串、字節(jié)字符串或 memoryview 的形式傳遞給 HttpResponse 構(gòu)造函數(shù)。例如:

>>> from django.http import HttpResponse
>>> response = HttpResponse("Hello World!")

這樣,在函數(shù)結(jié)束的時(shí)候return response前端就能拿到響應(yīng)數(shù)據(jù)了。

但如果你想增量添加內(nèi)容,你可以使用 response 作為一個(gè)類似文件的對(duì)象:

>>> response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")
>>> response.write("<p>Here's another paragraph.</p>")

在前后端分離的大趨勢(shì)下,我們機(jī)會(huì)很少使用后端去渲染頁(yè)面。后端通常都是返回JSON數(shù)據(jù)。

傳入迭代器

你可以傳遞 HttpResponse 一個(gè)迭代器而不是字符串。HttpResponse 將立即消耗迭代器,將其內(nèi)容存儲(chǔ)為一個(gè)字符串,然后丟棄它。帶有 close() 方法的對(duì)象,如文件和生成器,會(huì)立即關(guān)閉。如果你需要將響應(yīng)從迭代器流式傳輸?shù)娇蛻舳?,你必須使?StreamingHttpResponse 類來(lái)代替。

這種操作在普通場(chǎng)景下沒(méi)什么問(wèn)題,但是如果文件或者圖片很多,并且很大,通常我們使用一個(gè)獨(dú)立的靜態(tài)文件服務(wù)器來(lái)解決問(wèn)題,而不是由Django來(lái)處理這些東西

** 告訴瀏覽器將響應(yīng)作為文件附件處理 **

>>> response = HttpResponse(my_data, headers={
...     'Content-Type': 'application/vnd.ms-excel',
...     'Content-Disposition': 'attachment; filename="foo.xls"',
... })

Content-Disposition 頭并沒(méi)有什么 Django 特有的內(nèi)容,但是很容易忘記語(yǔ)法,所以我們把它包含在這里。

HttpResponse對(duì)象屬性

1.HttpResponse.charset

表示響應(yīng)將被編碼的字符集的字符串。如果在 HttpResponse 實(shí)例化時(shí)沒(méi)有給出,將從 content_type 中提取,如果不成功,將使用 DEFAULT_CHARSET(如果沒(méi)有設(shè)置,默認(rèn)為utf-8)設(shè)置。

2.HttpResponse.status_code

HttpResponse對(duì)象的 HTTP 狀態(tài)碼。

除非 reason_phrase 被明確設(shè)置,否則在構(gòu)造函數(shù)外修改 status_code 的值也會(huì)修改 reason_phrase 的值。

HttpResponse對(duì)象方法

1.HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None)

設(shè)置一個(gè) cookie。參數(shù)與 Python 標(biāo)準(zhǔn)庫(kù)中的 Morsel cookie 對(duì)象相同。

max_age should be an integer number of seconds, or None (default) if the cookie should last only as long as the client's browser session. If expires is not specified, it will be calculated.

expires 應(yīng)是格式為 “Wdy, DD-Mon-YY HH:MM:SS GMT” 的字符串,或者是 UTC 的 datetime.datetime 對(duì)象。如果 expires 是一個(gè) datetime 對(duì)象,將計(jì)算 max_age。

max_age在不遠(yuǎn)的將來(lái)會(huì)取代expires。

如果你想設(shè)置一個(gè)跨域的 cookie,請(qǐng)使用 domain。例如,domain=“example.com” 將設(shè)置一個(gè)可被 www.example.com、blog.example.com 等域讀取的 cookie。否則,一個(gè) cookie 將只能被設(shè)置它的域讀取。

如果你想讓 cookie 只在使用 https 方案進(jìn)行請(qǐng)求時(shí)才發(fā)送給服務(wù)器,請(qǐng)使用 secure=True。

如果你想防止客戶端的 JavaScript 訪問(wèn) cookie,請(qǐng)使用 httponly=True。

HttpOnly 是包含在 Set-Cookie HTTP 響應(yīng)頭中的一個(gè)標(biāo)志。它是 RFC 6265 標(biāo)準(zhǔn)中 Cookie 的一部分,可以作為一種有用的方式來(lái)降低客戶端腳本訪問(wèn)受保護(hù) Cookie 數(shù)據(jù)的風(fēng)險(xiǎn)。

使用 samesite=‘Strict' 或 samesite=‘Lax' 來(lái)告訴瀏覽器在執(zhí)行跨源請(qǐng)求時(shí)不要發(fā)送這個(gè) cookie。SameSite 并不是所有瀏覽器都支持,所以它并不能替代 Django 的 CSRF 保護(hù),而是一種深度防御措施。

使用 samesite='‘None' (字符串)來(lái)明確說(shuō)明這個(gè) cookie 會(huì)隨著所有的同站和跨站請(qǐng)求而發(fā)送。

Changed in Django 3.1:

允許使用 samesite='None (字符串)。

2.HttpResponse.delete_cookie(key, path='/', domain=None, samesite=None)

刪除給定鍵的 cookie。如果鍵不存在,則靜默失敗。

由于 cookie 的工作方式,path 和 domain 應(yīng)該與你在 set_cookie() 中使用的值相同,否則 cookie 可能不會(huì)被刪除。

HttpResponse子類

HttpResponse子類可以直接參考Django文檔,對(duì)于現(xiàn)在而言,最常用的莫過(guò)于JsonResponse子類。在此,會(huì)專門(mén)介紹JsonResponse子類的。

JsonResponse對(duì)象

class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)

一個(gè) HttpResponse 子類,幫助創(chuàng)建一個(gè) JSON 編碼的響應(yīng)。它繼承了它的超類的大部分行為,但有一些不同:

其默認(rèn)的 Content-Type 頭設(shè)置為 application/json。

第一個(gè)參數(shù) data 應(yīng)該是 dict 實(shí)例。如果 safe 參數(shù)設(shè)置為 False (見(jiàn)下文),它可以是任何 JSON 可序列化的對(duì)象。

encoder,默認(rèn)為 django.core.serializers.json.DjangoJSONEncoder,將用于序列化數(shù)據(jù)。

safe 布爾參數(shù)默認(rèn)為 True。如果它被設(shè)置為 False,任何對(duì)象都可以被傳遞到序列化中(否則只允許 dict 實(shí)例)。如果 safe 為 True,而第一個(gè)參數(shù)是一個(gè)非 dict 對(duì)象,則會(huì)引發(fā)一個(gè) TypeError。

json_dumps_params 參數(shù)是一個(gè)關(guān)鍵字參數(shù)的字典,用來(lái)傳遞給 json.dumps() 調(diào)用,用于生成響應(yīng)??梢杂脕?lái)指定編碼。

參考資料

請(qǐng)求和響應(yīng)

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Python實(shí)現(xiàn)釘釘發(fā)送報(bào)警消息的方法

    Python實(shí)現(xiàn)釘釘發(fā)送報(bào)警消息的方法

    今天小編就為大家分享一篇Python實(shí)現(xiàn)釘釘發(fā)送報(bào)警消息的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • Python2.X/Python3.X中urllib庫(kù)區(qū)別講解

    Python2.X/Python3.X中urllib庫(kù)區(qū)別講解

    本篇文章通過(guò)對(duì)比給大家詳細(xì)講解了在Python2和Python3中urllib庫(kù)區(qū)別以及用法講解,有需要的朋友跟著學(xué)習(xí)下吧。
    2017-12-12
  • python模塊內(nèi)置屬性概念及實(shí)例

    python模塊內(nèi)置屬性概念及實(shí)例

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python模塊內(nèi)置屬性概念及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • python?turtle庫(kù)畫(huà)圣誕樹(shù)詳細(xì)代碼教程

    python?turtle庫(kù)畫(huà)圣誕樹(shù)詳細(xì)代碼教程

    這篇文章主要介紹了python?turtle庫(kù)畫(huà)圣誕樹(shù)詳細(xì)代碼教程,圣誕節(jié)快到了,下面小編就來(lái)利用python?turtle庫(kù)畫(huà)一顆圣誕樹(shù),?主要成分有圣誕樹(shù)的本體、大小蝴蝶結(jié)、星星、圣誕帽和襪子,需要的朋友可以參考一下
    2021-12-12
  • Django中Forms的使用代碼解析

    Django中Forms的使用代碼解析

    這篇文章主要介紹了Django中Forms的使用代碼解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Python用scipy生成特殊矩陣

    Python用scipy生成特殊矩陣

    本文主要介紹了Pytho用scipy生成特殊矩陣詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們可以參考一下
    2023-04-04
  • 詳解Python如何利用petl做數(shù)據(jù)遷移

    詳解Python如何利用petl做數(shù)據(jù)遷移

    隨著數(shù)據(jù)量的不斷增長(zhǎng),數(shù)據(jù)遷移成為了一項(xiàng)必不可少的任務(wù),本文就來(lái)為大家詳細(xì)介紹一下如何使用PETL進(jìn)行數(shù)據(jù)遷移,并給出一些實(shí)踐案例,需要的可以參考下
    2024-01-01
  • pandas實(shí)現(xiàn)數(shù)據(jù)讀取&清洗&分析的項(xiàng)目實(shí)踐

    pandas實(shí)現(xiàn)數(shù)據(jù)讀取&清洗&分析的項(xiàng)目實(shí)踐

    近期因工作需要,需對(duì)幾十萬(wàn)條商品和訂單數(shù)據(jù)進(jìn)行初步的數(shù)據(jù)分析,本文主要pandas實(shí)現(xiàn)數(shù)據(jù)讀取&清洗&分析的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-05-05
  • Python中文字符串截取問(wèn)題

    Python中文字符串截取問(wèn)題

    web應(yīng)用難免會(huì)截取字符串的需求,Python中截取英文很容易,但是截取utf-8的中文機(jī)會(huì)截取一半導(dǎo)致一些不是亂碼的亂碼.其實(shí)utf8截取很簡(jiǎn)單,這里記下來(lái)分享給大家
    2015-06-06
  • 解讀Python條件判斷邏輯演繹優(yōu)化編程思維

    解讀Python條件判斷邏輯演繹優(yōu)化編程思維

    條件判斷是編程中的重要概念,Python語(yǔ)言提供了多種方式來(lái)進(jìn)行條件判斷,例如if、else、elif等,本文將深入探討Python中條件判斷的靈活應(yīng)用,結(jié)合豐富的示例代碼展示其全面性
    2024-01-01

最新評(píng)論