最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django的HttpRequest和HttpResponse對象詳解

 更新時間:2018年01月26日 11:11:13   作者:liu_yanna  
這篇文章主要介紹了Django的HttpRequest和HttpResponse對象,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

本文研究的主要是Django的HttpRequest和HttpResponse對象的相關(guān)內(nèi)容,具體如下。

請求一張頁面時,Django把請求的metadata數(shù)據(jù)包裝成一個HttpRequest對象,然后Django加載合適的view方法,把這個HttpRequest 對象作為第一個參數(shù)傳給view方法。任何view方法都應該返回一個HttpResponse對象。
我們在本書中大量使用這兩個對象;本附錄詳細解釋HttpRequest和HttpResponse對象。

HttpRequest

HttpRequest代表一個來自uesr-agent的HTTP請求。

大多重要的請求信息都是作為HttpRequest 對象的屬性出現(xiàn)(see Table H-1). 除了session外,其他所有屬性都是只讀的。

Table H-1. HttpRequest對象的屬性

Attribute

Description

path

請求頁面的全路徑,不包括域名—例如, "/music/bands/the_beatles/"。

method

請求中使用的HTTP方法的字符串表示。全大寫表示。例如:

if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()

GET

包含所有HTTP GET參數(shù)的類字典對象。參見QueryDict 文檔。

POST

包含所有HTTP POST參數(shù)的類字典對象。參見QueryDict 文檔。

服務器收到空的POST請求的情況也是有可能發(fā)生的。也就是說,表單form通過HTTP POST方法提交請求,但是表單中可以沒有數(shù)據(jù)。因此,不能使用語句if request.POST來判斷是否使用HTTP POST方法;應該使用if request.method == "POST" (參見本表的method屬性)。

注意: POST不包括file-upload信息。參見FILES屬性。

REQUEST

為了方便,該屬性是POST和GET屬性的集合體,但是有特殊性,先查找POST屬性,然后再查找GET屬性。借鑒PHP's $_REQUEST。

例如,如果GET = {"name": "john"} 和POST = {"age": '34'},則 REQUEST["name"] 的值是"john", REQUEST["age"]的值是"34".

強烈建議使用GET and POST,因為這兩個屬性更加顯式化,寫出的代碼也更易理解。

COOKIES

包含所有cookies的標準Python字典對象。Keys和values都是字符串。參見第12章,有關(guān)于cookies更詳細的講解。

FILES

包含所有上傳文件的類字典對象。FILES中的每個Key都是<input type="file" name="" />標簽中name屬性的值. FILES中的每個value 同時也是一個標準Python字典對象,包含下面三個Keys:

  • filename: 上傳文件名,用Python字符串表示
  • content-type: 上傳文件的Content type
  • content: 上傳文件的原始內(nèi)容

注意:只有在請求方法是POST,并且請求頁面中<form>有enctype="multipart/form-data"屬性時FILES才擁有數(shù)據(jù)。否則,F(xiàn)ILES 是一個空字典。

META

包含所有可用HTTP頭部信息的字典。 例如:

  • CONTENT_LENGTH
  • CONTENT_TYPE
  • QUERY_STRING: 未解析的原始查詢字符串
  • REMOTE_ADDR: 客戶端IP地址
  • REMOTE_HOST: 客戶端主機名
  • SERVER_NAME: 服務器主機名
  • SERVER_PORT: 服務器端口

META 中這些頭加上前綴HTTP_最為Key, 例如:

  • HTTP_ACCEPT_ENCODING
  • HTTP_ACCEPT_LANGUAGE
  • HTTP_HOST: 客戶發(fā)送的HTTP主機頭信息
  • HTTP_REFERER: referring頁
  • HTTP_USER_AGENT: 客戶端的user-agent字符串
  • HTTP_X_BENDER: X-Bender頭信息

user

是一個django.contrib.auth.models.User 對象,代表當前登錄的用戶。如果訪問用戶當前沒有登錄,user將被初始化為django.contrib.auth.models.AnonymousUser的實例。你可以通過user的is_authenticated()方法來辨別用戶是否登錄:

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

只有激活Django中的AuthenticationMiddleware時該屬性才可用

關(guān)于認證和用戶的更詳細講解,參見第12章。

session

唯一可讀寫的屬性,代表當前會話的字典對象。只有激活Django中的session支持時該屬性才可用。 參見第12章。

raw_post_data

原始HTTP POST數(shù)據(jù),未解析過。 高級處理時會有用處。

Request對象也有一些有用的方法,見Table H-2:

Table H-2. HttpRequest Methods

Method

Description

__getitem__(key)

返回GET/POST的鍵值,先取POST,后取GET。如果鍵不存在拋出 KeyError。

這是我們可以使用字典語法訪問HttpRequest對象。

例如,request["foo"]等同于先request.POST["foo"] 然后 request.GET["foo"]的操作。

has_key()

檢查request.GET or request.POST中是否包含參數(shù)指定的Key。

get_full_path()

返回包含查詢字符串的請求路徑。例如, "/music/bands/the_beatles/?print=true"

is_secure()

如果請求是安全的,返回True,就是說,發(fā)出的是HTTPS請求。

QueryDict對象

在HttpRequest對象中, GET和POST屬性是django.http.QueryDict類的實例。 QueryDict類似字典的自定義類,用來處理單鍵對應多值的情況。因為一些HTML form元素,例如,<selectmultiple="multiple">, 就會傳多個值給單個鍵。

QueryDict對象是immutable(不可更改的),除非創(chuàng)建它們的copy()。這意味著我們不能直接改變request.POST and request.GET的屬性。

QueryDict實現(xiàn)所有標準的字典方法。還包括一些特有的方法,見Table H-3.

Table H-3. How QueryDicts Differ from Standard Dictionaries.

Method

Differences from Standard dict Implementation

__getitem__

和標準字典的處理有一點不同,就是,如果Key對應多個Value,__getitem__()返回最后一個value。

__setitem__

設置參數(shù)指定key的value列表(一個Python list)。注意:它只能在一個mutable QueryDict 對象上被調(diào)用(就是通過copy()產(chǎn)生的一個QueryDict對象的拷貝).

get()

如果key對應多個value,get()返回最后一個value。

update()

參數(shù)可以是QueryDict,也可以是標準字典。和標準字典的update方法不同,該方法添加字典 items,而不是替換它們:

>>> q = QueryDict('a=1')

>>> q = q.copy() # to make it mutable

>>> q.update({'a': '2'})

>>> q.getlist('a')

 ['1', '2']

>>> q['a'] # returns the last

['2']

items()

和標準字典的items()方法有一點不同,該方法使用單值邏輯的__getitem__():

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.items()

[('a', '3')]

values()

和標準字典的values()方法有一點不同,該方法使用單值邏輯的__getitem__():

此外, QueryDict也有一些方法,見Table H-4.

H-4. 額外的 (非字典的) QueryDict 方法

Method

Description

copy()

返回對象的拷貝,內(nèi)部實現(xiàn)是用Python標準庫的copy.deepcopy()。該拷貝是mutable(可更改的) — 就是說,可以更改該拷貝的值。

getlist(key)

返回和參數(shù)key對應的所有值,作為一個Python list返回。如果key不存在,則返回空list。 It's guaranteed to return a list of some sort..

setlist(key,list_)

設置key的值為list_ (unlike __setitem__()).

appendlist(key,item)

添加item到和key關(guān)聯(lián)的內(nèi)部list.

setlistdefault(key,list)

和setdefault有一點不同,它接受list而不是單個value作為參數(shù)。

lists()

和items()有一點不同, 它會返回key的所有值,作為一個list, 例如:

>>> q = QueryDict('a=1&a=2&a=3')

>>> q.lists()

[('a', ['1', '2', '3'])]

urlencode()

返回一個以查詢字符串格式進行格式化后的字符串(e.g., "a=2&b=3&b=5").

A Complete Example

例如, 下面是一個HTML form:

<span style="font-size:12px;"><form action="/foo/bar/" method="post"> 
<input type="text" name="your_name" /> 
<select multiple="multiple" name="bands">  
  <option value="beatles">The Beatles</option> 
  <option value="who">The Who</option> 
  <option value="zombies">The Zombies</option> 
</select> 
<input type="submit" /> 
</form></span> 

如果用戶在your_name域中輸入"JohnSmith",同時在多選框中選擇了“The Beatles”和“The Zombies”,下面是Django請求對象的內(nèi)容:

>>> request.GET{} 
>>> request.POST 
{'your_name': ['John Smith'], 'bands': ['beatles', 'zombies']} 
>>> request.POST['your_name'] 
'John Smith'  
>>> request.POST['bands'] 
'zombies' 
>>> request.POST.getlist('bands') 
['beatles', 'zombies'] 
>>> request.POST.get('your_name', 'Adrian') 
'John Smith' 
>>> request.POST.get('nonexistent_field', 'Nowhere Man') 
'Nowhere Man'

HttpResponse

對于HttpRequest 對象來說,是由Django自動創(chuàng)建, 但是,HttpResponse對象就必須我們自己創(chuàng)建。每個View方法必須返回一個HttpResponse對象。

HttpResponse類在django.http.HttpResponse。

構(gòu)造HttpResponses

一般地, 你可以通過給HttpResponse的構(gòu)造函數(shù)傳遞字符串表示的頁面內(nèi)容來構(gòu)造HttpResponse對象:

>>> response = HttpResponse("Here's the text of the Web page.") 
>>> response = HttpResponse("Text only, please.", mimetype="text/plain")

但是如果想要增量添加內(nèi)容, 你可以把response當作filelike對象使用:

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

也可以給HttpResponse傳遞一個iterator作為參數(shù),而不用傳遞硬編碼字符串。 如果你使用這種技術(shù), 下面是需要注意的一些事項:

· iterator應該返回字符串.

· 如果HttpResponse使用iterator進行初始化,就不能把HttpResponse實例作為filelike 對象使用。這樣做將會拋出異常。

最后,再說明一下,HttpResponse實現(xiàn)了write()方法, 可以在任何需要filelike對象的地方使用HttpResponse對象。參見第11章,有一些例子。

設置Headers

你可以使用字典語法添加,刪除headers:

>>> response = HttpResponse()  
>>> response['X-DJANGO'] = "It's the best." 
>>> del response['X-PHP'] 
>>> response['X-DJANGO'] 
"It's the best."

你也可以使用has_header(header)方法檢測某個header是否存在。

不要手動設置Cookie headers;具體的做法,參見第12章,有關(guān)于怎樣在Django中處理cookies的詳細講解。

HttpResponse子類

Django包含很多HttpResponse子類,用來處理不同的HTTP響應類型(見Table H-5). 和HttpResponse一樣, 這些子類在django.http中.

Table H-5. HttpResponse Subclasses

Class

Description

HttpResponseRedirect

構(gòu)造函數(shù)接受單個參數(shù):重定向到的URL??梢允侨玌RL (e.g., 'http://search.yahoo.com/')或者相對URL(e.g., '/search/'). 注意:這將返回HTTP狀態(tài)碼302。

HttpResponsePermanentRedirect

同HttpResponseRedirect一樣,但是返回永久重定向(HTTP 狀態(tài)碼 301)。

HttpResponseNotModified

構(gòu)造函數(shù)不需要參數(shù)。Use this to designate that a page hasn't been modified since the user's last request.

HttpResponseBadRequest

返回400 status code。

HttpResponseNotFound

返回404 status code.

HttpResponseForbidden

返回403 status code.

HttpResponseNotAllowed

返回405 status code. 它需要一個必須的參數(shù):一個允許的方法的list (e.g., ['GET','POST']).

HttpResponseGone

返回410 status code.

HttpResponseServerError

返回500 status code.

當然,你也可以自己定義不包含在上表中的HttpResponse子類。

返回Errors

在Django中返回HTTP錯誤碼是很容易的。上面介紹了HttpResponseNotFound, HttpResponseForbidden, HttpResponseServerError等一些子類。View方法中返回這些子類的實例就OK了,例如:

def my_view(request):   
  # ...   
  if foo:     
     return HttpResponseNotFound('<h1>Page not found</h1>')   
  else:     
     return HttpResponse('<h1>Page was found</h1>')

當返回HttpResponseNotFound時,你需要定義錯誤頁面的HTML:

return HttpResponseNotFound('<h1>Page not found</h1>')

因為404錯誤是最常使用的HTTP錯誤, 有一個更方便的方法處理它。

為了方便,而且整個站點有一致的404錯誤頁面也是友好的,Django提供一個Http404異常類。如果在一個View方法中拋出Http404,Django將會捕獲它并且返回標準錯誤頁面,同時返回錯誤碼404。

from django.http import Http404 
 
def detail(request, poll_id):   
  try:     
    p = Poll.objects.get(pk=poll_id)   
  except Poll.DoesNotExist:     
     raise Http404   
  return render_to_response('polls/detail.html', {'poll': p})

為了使用Http404異常, 你需要創(chuàng)建一個模板文件。當異常拋出時,就會顯示該模板文件。該模板文件的文件名是404.html,在模板根目錄下創(chuàng)建。

自定義404 (Not Found) View方法

當拋出Http404異常時, Django會加載一個特殊的view方法處理404錯誤。默認地, 它是django.views.defaults.page_not_found,負責加載和渲染404.html模板文件。

這意味著我們必須在模板根目錄定義404.html模板文件,該模板文件應用于所有的404異常。

該page_not_found view方法應該可以應對幾乎99%的Web App,但是如果想要重載該view方法時, 你可以在URLConf文件中指定handler404為自定義的404 errpr view方法, 像這樣:

from django.conf.urls.defaults import * 
 
urlpatterns = patterns('',   
  ... 
) 
 
handler404 = 'mysite.views.my_custom_404_view'

Django就是通過在URLConf文件中查找handler404來決定404 view方法的。默認地, URLconfs包含下面一行代碼:

from django.conf.urls.defaults import *

在 django/conf/urls/defaults.py模塊中, handler404賦值為 'django.views.defaults.page_not_found'。

注意:

· 如果請求URL沒有和Django的URLConf文件中的任何一個正則表示式匹配,404 view方法就會被調(diào)用。

· 如果沒有定義自己的404 view — 使用默認地404 view,你仍然有一個工作要做:在模板根目錄創(chuàng)建404.html模板文件。默認地404 view將使用該模板處理所有404錯誤。

· 如果 DEBUG設置為True (在setting模塊中),404 view方法不會被使用,取而代之的是,traceback信息。

自定義500 (Server Error) View方法

同樣地,當view代碼發(fā)生運行時錯誤時,Django也會產(chǎn)生特殊行為。如果view方法產(chǎn)生異常,Django將會調(diào)用默認地view方法django.views.defaults.server_error, 該方法加載渲染500.html模板文件。

這意味著我們必須在模板根目錄定義500.html模板文件,該模板文件應用于所有的服務器錯誤。

該server_error view方法應該可以應對幾乎99%的Web App,但是如果想要重載該view方法時, 你可以在URLConf文件中指定handler500為自定義的server error view方法, 像這樣:

from django.conf.urls.defaults import * 
 
  urlpatterns = patterns('',   
 
    ... 
 
  )  
 
  handler500 = 'mysite.views.my_custom_error_view'

翻譯文章來源 (Django官網(wǎng)文檔):https://docs.djangoproject.com/en/1.9/ref/request-response/#django.http.HttpRequest
其中進行了一些整理。

總結(jié)

以上就是本文關(guān)于Django的HttpRequest和HttpResponse對象詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • Python數(shù)據(jù)結(jié)構(gòu)之棧、隊列及二叉樹定義與用法淺析

    Python數(shù)據(jù)結(jié)構(gòu)之棧、隊列及二叉樹定義與用法淺析

    這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)之棧、隊列及二叉樹定義與用法,結(jié)合具體實例形式分析了Python數(shù)據(jù)結(jié)構(gòu)中棧、隊列及二叉樹的定義與使用相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • Ubuntu16安裝Python3.9的實現(xiàn)步驟

    Ubuntu16安裝Python3.9的實現(xiàn)步驟

    這篇文章主要介紹了Ubuntu16安裝Python3.9的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 詳解python日志輸出使用配置文件格式

    詳解python日志輸出使用配置文件格式

    這篇文章主要介紹了詳解python日志輸出使用配置文件格式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • 使用Python編寫簡單的畫圖板程序的示例教程

    使用Python編寫簡單的畫圖板程序的示例教程

    這篇文章主要介紹了使用Python編寫簡單的畫圖板軟件的示例教程,利用到了經(jīng)常被用來做游戲的pygame模塊,需要的朋友可以參考下
    2015-12-12
  • python中的property及屬性與特性之間的優(yōu)先權(quán)

    python中的property及屬性與特性之間的優(yōu)先權(quán)

    這篇文章主要介紹了python中的property及屬性與特性之間的優(yōu)先權(quán),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • 分享10提高?Python?代碼的可讀性的技巧

    分享10提高?Python?代碼的可讀性的技巧

    這篇文章主要介紹了分享10提高?Python?代碼的可讀性的技巧,本文介紹20個常用的Python技巧來提高代碼的可讀性,并能幫助你節(jié)省大量時間,下面的技巧將在你的日常編碼練習中非常實用,需要的朋友可以參考一下
    2022-03-03
  • Python3+pycuda實現(xiàn)執(zhí)行簡單GPU計算任務

    Python3+pycuda實現(xiàn)執(zhí)行簡單GPU計算任務

    GPU的加速技術(shù)在深度學習、量子計算領域都已經(jīng)被廣泛的應用。這篇文章就來和大家聊聊Python3如何利用pycuda執(zhí)行簡單GPU計算任務?,感興趣的可以了解一下
    2023-03-03
  • pytorch 如何使用amp進行混合精度訓練

    pytorch 如何使用amp進行混合精度訓練

    這篇文章主要介紹了pytorch 使用amp進行混合精度訓練的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 使用Python實現(xiàn)博客上進行自動翻頁

    使用Python實現(xiàn)博客上進行自動翻頁

    這篇文章主要介紹了使用Python實現(xiàn)博客上進行自動翻頁,需要的朋友可以參考下
    2017-08-08
  • python實現(xiàn)簡單的單變量線性回歸方法

    python實現(xiàn)簡單的單變量線性回歸方法

    今天小編就為大家分享一篇python實現(xiàn)簡單的單變量線性回歸方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11

最新評論

黔西| 镇原县| 株洲县| 离岛区| 信丰县| 宽甸| 泽普县| 庆城县| 道孚县| 白沙| 射洪县| 韶山市| 铁岭县| 沙田区| 小金县| 孝感市| 崇义县| 海盐县| 天气| 毕节市| 怀远县| 东乡族自治县| 阿荣旗| 金昌市| 温州市| 道孚县| 常熟市| 靖西县| 体育| 靖江市| 泾阳县| 山阴县| 浠水县| 邻水| 木里| 克山县| 南通市| 宁远县| 象州县| 泽库县| 紫阳县|