django的request處理流程和錯誤處理

2021-08-26 21:13:56 字數 2490 閱讀 8507

jango如何處理乙個請求:

1.找到root urlconf module ,就是root_urlconf中的資訊。但是,如果傳進來的httprequest物件有乙個名

叫urlconf的屬性(這是在middleware中設定的),那麼將採用這個屬性的值來代替root_urlconf中的資訊。

2.django匯入模組,尋找urlpatterns變數。這個變數必須是乙個list型別的值。是使用patterns()函式返回

的。3.django搜尋urls,找到第乙個匹配的url

4.django匯入和呼叫給出的view函式。這個函式將得到乙個httprequest物件作為第乙個引數,再加上從url

上得到的其他引數的值。

5.如果沒有匹配到任何正規表示式,那麼將報錯。並轉到錯誤檢視處理。

注意:每個正規表示式都會在第一次訪問時編譯,這樣可以更快。

patterns中可以使用include()將其他應用匯入到這裡。

傳遞額外的引數到檢視函式

urlpatterns = patterns(』blog.views』,

(r』^blog/(?p\d)/$』, 』year_archive』, ),)

這樣,views.year_archive函式將得到兩個引數year和foo。

如果兩個引數的名字是一樣的,則儲存從url中得到的引數的值。

urlpatterns = patterns(』』,

(r』^blog/』, include(』inner』), ),

)這樣,inner.py中的每行url都會包含blogid這個引數。不管檢視函式是否需要。

一般情況下,我們不能夠將兩個及以上的url對映到乙個view函式。因為,django無法從view函式得到相對應

的url。

解決這種辦法可以使用 named url patterns

urlpatterns = patterns(』』,

url(r』^archive/(\d)/$』, archive, name="full-archive"),

url(r』^archive-summary/(\d)/$』, archive, , "arch-summary"),

)編寫檢視函式

返回錯誤

def my_view(request):

# ...

if foo:

return httpresponsenotfound(』』) #返回的是404錯誤

使用狀態碼:

def my_view(request):

# ...

# return a "created" (201) response code.

return httpresponse(status=201) #可以返回任何狀態碼

404錯誤:

http404將呼叫你的template根目錄下的404.html的檔案

預設情況下,當產生了http404 exception,django會使用乙個特殊的檢視來處理404錯誤——

django.views.defaults.page_not_found,然後它會裝載和渲染404.html模板。這個處理函式會返回乙個變

量:request_path。就是產生異常的這個url。

這個處理函式可以滿足99%的web應用,如果你想使用自己的404處理函式,可以如下:

handler404='mysite.my_own_404_view' (urls.py檔案中)

django決定404的處理檢視是通過在你的root urlconf中查詢handler404來實現的。如果沒有找到,就使用系

統自帶的。

注意:1.當乙個url沒有找到匹配的正規表示式時,那麼他就會使用404檢視

2.如果你想使用系統自帶的404處理檢視,那麼你還要建立乙個404.html模板。

3.如果settings.py的debug設定為true時,你的404檢視將永遠也不會被使用。將會被一些除錯資訊取代

500錯誤:

預設使用django.views.defaults.server_error來處理。必須提供乙個500.html檔案。不同的是,500處理

檢視不會傳遞任何引數到模板中。

自定義500錯誤處理檢視使用:

handler500='mysite.myview'

403錯誤,同404和500錯誤處理方法

預設處理檢視django.views.defaults.permission_denied

django 中的 request 物件

我們知道當urlconf檔案匹配到使用者輸入的路徑後,會呼叫對應的view函式,並將httprequest物件作為第乙個引數傳入該函式。django 每乙個view函式的第乙個引數都是request,有沒想過request裡面到底有什麼呢?django使用request和response物件在系統間...

Django獲取全域性request

某些情景下,我們需要在任意函式內獲取request,但是django並沒有給我們提供獲取全域性request的方法。當request到達檢視函式前,會經過中介軟體攔截。我們可以自己寫乙個中介軟體,並設計成單例模式。然後在中介軟體中取得當前request物件,並儲存在中介軟體物件中。middlewar...

django 檢視request的詳細引數

如果需要檢視前台傳來的header中的詳細引數並獲取的話,使用以下方式即可 在views.py中新增以下函式 from django.core.handlers.wsgi import wsgirequest def test request print type request 列印出reques...