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...