91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解Python Django請求和響應對象

發布時間:2021-11-01 15:41:22 來源:億速云 閱讀:116 作者:iii 欄目:開發技術

本篇內容主要講解“怎么理解Python Django請求和響應對象”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么理解Python Django請求和響應對象”吧!

Django請求和響應對象

Django 使用請求和響應對象在系統中傳遞狀態。

當一個頁面被請求時,Django 會創建一個 HttpRequest 對象,這個對象包含了請求的元數據。然后,Django 加載相應的視圖,將 HttpRequest 作為視圖函數的第一個參數。每個視圖負責返回一個 HttpResponse 對象。

HttpRequest對象

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

HttpRequest常用屬性

1.HttpRequest.body

原始的 HTTP 請求體作為一個字節字符串。這對于以不同方式處理非常規 HTML 表單的數據很有用:二進制圖像,XML 有效負載等。對于處理傳統的表單數據,使用 HttpRequest.POST

2.HttpRequest.method

代表請求中使用的 HTTP 方法的字符串,一定是大寫字母。

3.HttpRequest.GET

一個類似字典的對象,包含所有給定的 HTTP GET 參數。

4.HttpRequest.POST

一個類似字典的對象,包含所有給定的 HTTP POST 參數,前提是請求包含表單數據。如果你需要訪問請求中發布的原始或非表單數據,可以通過 HttpRequest.body 屬性來訪問。

以上的4個屬性是我們最常用的HttpRequest屬性。結合實際,我們可能寫出的代碼如下:

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

5.HttpRequest.COOKIES

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

6.HttpRequest.FILES

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

FILES 只有在請求方法是 POST,并且發布請求的<form>有 enctype=“multipart/form-data” 的情況下,才會包含數據。否則,FILES 將是一個類似字典的空白對象。

7.HttpRequest.META

一個包含所有可用的 HTTP 頭文件的字典。可用的頭信息取決于客戶端和服務器。一些可能的例子如下:

1.CONTENT_LENGTH —— 請求體的長度(字符串)。

2.CONTENT_TYPE —— 請求體的 MIME 類型。

3.HTTP_ACCEPT —— 可接受的響應內容類型。

4.HTTP_ACCEPT_ENCODING —— 可接受的響應編碼。

5.HTTP_ACCEPT_LANGUAGE —— 可接受的響應語言。

6.HTTP_HOST —— 客戶端發送的 HTTP 主機頭。

7.HTTP_REFERER —— referrer 頁面,如果有的話。

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

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

10.REMOTE_ADDR —— 客戶機的 IP 地址。

11.REMOTE_HOST —— 客戶機的主機名。

12.REMOTE_USER —— Web 服務器認證的用戶,如果有的話。

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

14.SERVER_NAME —— 服務器的主機名。

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

請求中的任何 HTTP 頭都會被轉換為 META 鍵,方法是將所有字符轉換為大寫字母,用下劃線代替任何連字符,并在名稱前加上 HTTP_` 前綴。例如,請求頭里的X-CSRFToken在META中變為HTTP_X_CSRFTOKEN.

中間件設置的屬性

Django 的 contrib 應用中包含的一些中間件會在請求中設置屬性。

1.HttpRequest.session

來自 SessionMiddleware。一個可讀可寫的,類似字典的對象,代表當前會話。

2.HttpRequest.user

從 AuthenticationMiddleware。AUTH_USER_MODEL 的一個實例,代表當前登錄的用戶。如果用戶當前沒有登錄,user 將被設置為一個 AnonymousUser 的實例。你可以用 is_authenticated 來區分它們,例如:

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

如果使用Nginx+uWsgi的方式部署Django項目,那么META中的REMOTE_ADDR,REMOTE_HOST等不正確的,因為通過Nginx代理轉發到uWsgi監聽的端口,這時候應用程序獲取的客戶端信息就是127.0.0.1的本機信息,而不是真實客戶端的信息。因此,需要在Nginx中添加如下參數:

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,取決于你的業務邏輯。

QueryDict對象

在一個 HttpRequest 對象中, GET 和 POST 屬性是 django.http.QueryDict 的實例,這是一個類似字典的類,用來處理同一個鍵的多個值。這是很有必要的,因為一些 HTML 表單元素,尤其是<select multiple>,會傳遞同一個鍵的多個值。

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

QueryDict方法

QueryDict是字典的子類,因此字典有的標準方法,QueryDict都具備。

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

 如果鍵不存在,則用鉤子返回一個默認值。如果鍵有多個值,則會獲取到最后一個值。

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

 返回帶有請求鍵的數據列表。如果鍵不存在且 default 是 None,則返回一個空列表。除非提供的默認值不是一個列表,否則返回一個列表。

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

>>> qd = QueryDict('a=1&a=2&a=3&b=4')  # 構造QueryDict對象qd
>>> qd.get('a')         # 獲取鍵a的最后一個值
'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對象

Django會自動創建HttpRequest(wsgi或者asgi創建)對象, HttpResponse則是后端開發人員負責實例化、填充和返回。每一個視圖函數都必須返回一個HttpResponse對象。

HttpResponse類位于django.http模塊中。

HttpResponse對象用法

典型的用法是將頁面的內容以字符串、字節字符串或 memoryview 的形式傳遞給 HttpResponse 構造函數。例如:

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

這樣,在函數結束的時候return response前端就能拿到響應數據了。

但如果你想增量添加內容,你可以使用 response 作為一個類似文件的對象:

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

在前后端分離的大趨勢下,我們機會很少使用后端去渲染頁面。后端通常都是返回JSON數據。

傳入迭代器

你可以傳遞 HttpResponse 一個迭代器而不是字符串。HttpResponse 將立即消耗迭代器,將其內容存儲為一個字符串,然后丟棄它。帶有 close() 方法的對象,如文件和生成器,會立即關閉。如果你需要將響應從迭代器流式傳輸到客戶端,你必須使用 StreamingHttpResponse 類來代替。

這種操作在普通場景下沒什么問題,但是如果文件或者圖片很多,并且很大,通常我們使用一個獨立的靜態文件服務器來解決問題,而不是由Django來處理這些東西

** 告訴瀏覽器將響應作為文件附件處理 **

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

Content-Disposition 頭并沒有什么 Django 特有的內容,但是很容易忘記語法,所以我們把它包含在這里。

HttpResponse對象屬性

1.HttpResponse.charset

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

2.HttpResponse.status_code

HttpResponse對象的 HTTP 狀態碼。

除非 reason_phrase 被明確設置,否則在構造函數外修改 status_code 的值也會修改 reason_phrase 的值。

HttpResponse對象方法

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

設置一個 cookie。參數與 Python 標準庫中的 Morsel cookie 對象相同。

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 應是格式為 “Wdy, DD-Mon-YY HH:MM:SS GMT” 的字符串,或者是 UTC 的 datetime.datetime 對象。如果 expires 是一個 datetime 對象,將計算 max_age。

max_age在不遠的將來會取代expires。

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

如果你想讓 cookie 只在使用 https 方案進行請求時才發送給服務器,請使用 secure=True。

如果你想防止客戶端的 JavaScript 訪問 cookie,請使用 httponly=True。

HttpOnly 是包含在 Set-Cookie HTTP 響應頭中的一個標志。它是 RFC 6265 標準中 Cookie 的一部分,可以作為一種有用的方式來降低客戶端腳本訪問受保護 Cookie 數據的風險。

使用 samesite=‘Strict' 或 samesite=‘Lax' 來告訴瀏覽器在執行跨源請求時不要發送這個 cookie。SameSite 并不是所有瀏覽器都支持,所以它并不能替代 Django 的 CSRF 保護,而是一種深度防御措施。

使用 samesite='‘None' (字符串)來明確說明這個 cookie 會隨著所有的同站和跨站請求而發送。

Changed in Django 3.1:

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

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

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

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

HttpResponse子類

HttpResponse子類可以直接參考Django文檔,對于現在而言,最常用的莫過于JsonResponse子類。在此,會專門介紹JsonResponse子類的。

JsonResponse對象

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

一個 HttpResponse 子類,幫助創建一個 JSON 編碼的響應。它繼承了它的超類的大部分行為,但有一些不同:

其默認的 Content-Type 頭設置為 application/json。

第一個參數 data 應該是 dict 實例。如果 safe 參數設置為 False (見下文),它可以是任何 JSON 可序列化的對象。

encoder,默認為 django.core.serializers.json.DjangoJSONEncoder,將用于序列化數據。

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

json_dumps_params 參數是一個關鍵字參數的字典,用來傳遞給 json.dumps() 調用,用于生成響應。可以用來指定編碼。

到此,相信大家對“怎么理解Python Django請求和響應對象”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐清市| 开封市| 密云县| 云阳县| 普宁市| 永城市| 常州市| 中西区| 宾川县| 漳平市| 前郭尔| 余干县| 兴仁县| 永济市| 石城县| 合水县| 黄浦区| 丽水市| 新化县| 大邑县| 遂溪县| 中江县| 师宗县| 怀安县| 成安县| 蒲城县| 大埔县| 沐川县| 周口市| 池州市| 伊金霍洛旗| 自贡市| 巴东县| 余姚市| 太和县| 无锡市| 昂仁县| 团风县| 拜城县| 鹤峰县| 吴忠市|