欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Django的HttpRequest和HttpResponse對象

2015-12-04 14:40 7395人閱讀 評論(0) 收藏 舉報
分類(lèi):

請求一張頁(yè)面時(shí),Django把請求的metadata數據包裝成一個(gè)HttpRequest對象,然后Django加載合適的view方法,把這個(gè)HttpRequest 對象作為第一個(gè)參數傳給view方法。任何view方法都應該返回一個(gè)HttpResponse對象。

我們在本書(shū)中大量使用這兩個(gè)對象;本附錄詳細解釋HttpRequest和HttpResponse對象。

HttpRequest

HttpRequest代表一個(gè)來(lái)自uesr-agent的HTTP請求。

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

Table H-1. HttpRequest對象的屬性

Attribute

Description

path

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

method

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

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

GET

包含所有HTTP GET參數的類(lèi)字典對象。參見(jiàn)QueryDict 文檔。

POST

包含所有HTTP POST參數的類(lèi)字典對象。參見(jiàn)QueryDict 文檔。

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

注意: POST不包括file-upload信息。參見(jiàn)FILES屬性。

REQUEST

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

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

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

COOKIES

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

FILES

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

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

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

META

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

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

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

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

user

是一個(gè)django.contrib.auth.models.User 對象,代表當前登錄的用戶(hù)。如果訪(fǎng)問(wèn)用戶(hù)當前沒(méi)有登錄,user將被初始化為django.contrib.auth.models.AnonymousUser的實(shí)例。你可以通過(guò)user的is_authenticated()方法來(lái)辨別用戶(hù)是否登錄:

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

只有激活Django中的AuthenticationMiddleware時(shí)該屬性才可用

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

session

唯一可讀寫(xiě)的屬性,代表當前會(huì )話(huà)的字典對象。只有激活Django中的session支持時(shí)該屬性才可用。 參見(jiàn)第12章。

raw_post_data

原始HTTP POST數據,未解析過(guò)。 高級處理時(shí)會(huì )有用處。

Request對象也有一些有用的方法,見(jiàn)Table H-2:

 

Table H-2. HttpRequest Methods

Method

Description

__getitem__(key)

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

這是我們可以使用字典語(yǔ)法訪(fǎng)問(wèn)HttpRequest對象。

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

has_key()

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

get_full_path()

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

is_secure()

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

 

QueryDict對象

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

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

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

 

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

Method

Differences from Standard dict Implementation

__getitem__

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

__setitem__

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

get()

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

update()

參數可以是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()方法有一點(diǎn)不同,該方法使用單值邏輯的__getitem__():

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

>>> q.items()

[('a', '3')]

values()

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

 

此外, QueryDict也有一些方法,見(jiàn)Table H-4.

 

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

Method

Description

copy()

返回對象的拷貝,內部實(shí)現是用Python標準庫的copy.deepcopy()。該拷貝是mutable(可更改的) — 就是說(shuō),可以更改該拷貝的值。

getlist(key)

返回和參數key對應的所有值,作為一個(gè)Python list返回。如果key不存在,則返回空l(shuí)ist。 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)的內部list.

setlistdefault(key,list)

和setdefault有一點(diǎn)不同,它接受list而不是單個(gè)value作為參數。

lists()

和items()有一點(diǎn)不同, 它會(huì )返回key的所有值,作為一個(gè)list, 例如:

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

>>> q.lists()

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

urlencode()

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

 

A Complete Example

例如, 下面是一個(gè)HTML form:

  1. <span style="font-size:12px;"><form action="/foo/bar/" method="post">  
  2. <input type="text" name="your_name" />  
  3. <select multiple="multiple" name="bands">   
  4.    <option value="beatles">The Beatles</option>  
  5.     <option value="who">The Who</option>  
  6.     <option value="zombies">The Zombies</option>  
  7. </select>  
  8. <input type="submit" />  
  9. </form></span>  

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

[python] view plain copy
  1. <span style="font-size:12px;">>>> request.GET{}  
  2. >>> request.POST  
  3. {'your_name': ['John Smith'], 'bands': ['beatles''zombies']}  
  4. >>> request.POST['your_name']  
  5. 'John Smith'   
  6. >>> request.POST['bands']  
  7. 'zombies'  
  8. >>> request.POST.getlist('bands')  
  9. ['beatles''zombies']  
  10. >>> request.POST.get('your_name''Adrian')  
  11. 'John Smith'  
  12. >>> request.POST.get('nonexistent_field''Nowhere Man')  
  13. 'Nowhere Man'</span>  

HttpResponse

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

HttpResponse類(lèi)在django.http.HttpResponse。

構造HttpResponses

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

[python] view plain copy
  1. <span style="font-size:12px;">>>> response = HttpResponse("Here's the text of the Web page.")  
  2. >>> response = HttpResponse("Text only, please.", mimetype="text/plain")</span>  

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

[python] view plain copy
  1. <span style="font-size:12px;">>>> response = HttpResponse()  
  2. >>> response.write("<p>Here's the text of the Web page.</p>")  
  3. >>> response.write("<p>Here's another paragraph.</p>")</span>  
[python] view plain copy
  1. <span style="font-family: verdana, arial, helvetica, sans-serif; line-height: 15.6px; background-color: rgb(255, 255, 255);"><span style="font-size:12px;">也可以給HttpResponse傳遞一個(gè)iterator作為參數,而不用傳遞硬編碼字符串。 如果你使用這種技術(shù), 下面是需要注意的一些事項:</span></span>  

·         iterator應該返回字符串.

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

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

設置Headers

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

[python] view plain copy
  1. <span style="font-size:12px;">>>> response = HttpResponse()   
  2. >>> response['X-DJANGO'] = "It's the best."  
  3. >>> del response['X-PHP']  
  4. >>> response['X-DJANGO']  
  5. "It's the best."</span>  

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

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

HttpResponse子類(lèi)

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

 

Table H-5. HttpResponse Subclasses

Class

Description

HttpResponseRedirect

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

HttpResponsePermanentRedirect

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

HttpResponseNotModified

構造函數不需要參數。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. 它需要一個(gè)必須的參數:一個(gè)允許的方法的list (e.g., ['GET','POST']).

HttpResponseGone

返回410 status code.

HttpResponseServerError

返回500 status code.

 

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

返回Errors

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

[python] view plain copy
  1. <span style="font-size:12px;">def my_view(request):      
  2.     #  ...     
  3.     if foo:         
  4.          return HttpResponseNotFound('<h1>Page not found</h1>')      
  5.     else:          
  6.          return HttpResponse('<h1>Page was found</h1>')</span>  

當返回HttpResponseNotFound時(shí),你需要定義錯誤頁(yè)面的HTML:

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

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

為了方便,而且整個(gè)站點(diǎn)有一致的404錯誤頁(yè)面也是友好的,Django提供一個(gè)Http404異常類(lèi)。如果在一個(gè)View方法中拋出Http404,Django將會(huì )捕獲它并且返回標準錯誤頁(yè)面,同時(shí)返回錯誤碼404。

[python] view plain copy
  1. <span style="font-size:12px;">from django.http import Http404  
  2.   
  3. def detail(request, poll_id):      
  4.     try:          
  5.         p = Poll.objects.get(pk=poll_id)      
  6.     except Poll.DoesNotExist:         
  7.          raise Http404      
  8.     return render_to_response('polls/detail.html', {'poll': p})</span>  

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

自定義404 (Not Found) View方法

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

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

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

[python] view plain copy
  1. <span style="font-size:12px;">from django.conf.urls.defaults import *  
  2.   
  3. urlpatterns = patterns('',      
  4.     ...  
  5. )  
  6.   
  7. handler404 = 'mysite.views.my_custom_404_view'</span>  

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

[python] view plain copy
  1. <span style="font-size:12px;">from django.conf.urls.defaults import *</span>  

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

注意:

·         如果請求URL沒(méi)有和Django的URLConf文件中的任何一個(gè)正則表示式匹配,404 view方法就會(huì )被調用。

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

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

自定義500 (Server Error) View方法

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

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

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

[python] view plain copy
  1. <span style="font-size:12px;">from django.conf.urls.defaults import *  
  2.   
  3.    urlpatterns = patterns('',      
  4.   
  5.         ...  
  6.   
  7.    )   
  8.   
  9.    handler500 = 'mysite.views.my_custom_error_view'</span>  

翻譯文章來(lái)源 (Django官網(wǎng)文檔):https://docs.djangoproject.com/en/1.9/ref/request-response/#django.http.HttpRequest

其中進(jìn)行了一些整理。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Django框架-Django視圖(views)系統
python測試開(kāi)發(fā)django-98.views視圖函數中request參數詳解
005Django 表單 | 菜鳥(niǎo)教程
【django框架】共4大模塊50頁(yè)md學(xué)習文檔 第3篇:django路由和網(wǎng)絡(luò )請求使用詳解
Django Book 中文版
HttpServlet詳解
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久