有幾個(gè)Django 的內(nèi)建視圖在編寫視圖 中講述,文檔的其它地方也會(huì)有所講述。
static.serve(request, path, document_root, show_indexes=False)
在本地的開發(fā)環(huán)境中,除了你的項(xiàng)目中的靜態(tài)文件,可能還有一些文件,出于方便,你希望讓Django 來作為服務(wù)器。serve() 視圖可以用來作為任意目錄的服務(wù)器。(該視圖不能用于生產(chǎn)環(huán)境,應(yīng)該只用于開發(fā)時(shí)輔助使用;在生產(chǎn)環(huán)境中你應(yīng)該使用一個(gè)真實(shí)的前端Web 服務(wù)器來服務(wù)這些文件)。
最常見的例子是用戶上傳文檔到MEDIA_ROOT 中。django.contrib.staticfiles 用于靜態(tài)文件且沒有對(duì)用戶上傳的文件做處理,但是你可以通過在URLconf 中添加一些內(nèi)容來讓Django 作為MEDIA_ROOT 的服務(wù)器:
from django.conf import settings
from django.views.static import serve
# ... the rest of your URLconf goes here ...
if settings.DEBUG:
urlpatterns += [
url(r'^media/(?P<path>.*)$', serve, {
'document_root': settings.MEDIA_ROOT,
}),
]
注意,這里的代碼片段假設(shè)你的MEDIA_URL的值為'/media/'。它將調(diào)用serve() 視圖,傳遞來自URLconf 的路徑和(必選的)document_root 參數(shù)。
因?yàn)槎x這個(gè)URL 模式顯得有些笨拙,Django 提供一個(gè)小巧的URL 輔助函數(shù)static(),它接收MEDIA_URL這樣的參數(shù)作為前綴和視圖的路徑如'django.views.static.serve'。其它任何函數(shù)參數(shù)都將透明地傳遞給視圖。
Django 原生自帶幾個(gè)默認(rèn)視圖用于處理HTTP 錯(cuò)誤。若要使用你自定義的視圖覆蓋它們,請(qǐng)參見自定義錯(cuò)誤視圖。
defaults.page_not_found(request, template_name='404.html')
當(dāng)你在一個(gè)視圖中引發(fā)Http404 時(shí),Django 將加載一個(gè)專門的視圖用于處理404 錯(cuò)誤。默認(rèn)為django.views.defaults.page_not_found() 視圖,它產(chǎn)生一個(gè)非常簡(jiǎn)單的“Not Found” 消息或者渲染404.html模板,如果你在根模板目錄下創(chuàng)建了它的話。
默認(rèn)的404 視圖將傳遞一個(gè)變量給模板:request_path,它是導(dǎo)致錯(cuò)誤的URL。
關(guān)于404 視圖需要注意的3點(diǎn):
RequestContext并且可以訪問模板上下文處理器提供的變量(例如MEDIA_URL)。True(在你的settings 模塊中),那么將永遠(yuǎn)不會(huì)調(diào)用404 視圖,而是顯示你的URLconf 并帶有一些調(diào)試信息。defaults.server_error(request, template_name='500.html')
類似地,在視圖代碼中出現(xiàn)運(yùn)行時(shí)錯(cuò)誤,Django 將執(zhí)行特殊情況下的行為。如果一個(gè)視圖導(dǎo)致異常,Django 默認(rèn)情況下將調(diào)用django.views.defaults.server_error 視圖,它產(chǎn)生一個(gè)非常簡(jiǎn)單的“Server Error” 消息或者渲染500.html,如果你在你的根模板目錄下定義了它的話。
默認(rèn)的500 視圖不會(huì)傳遞變量給500.html 模板,且使用一個(gè)空Context 來渲染以減少再次出現(xiàn)錯(cuò)誤的可能性。
如果DEBUG 設(shè)置為True(在你的settings 模塊中),那么將永遠(yuǎn)不會(huì)調(diào)用500 視圖,而是顯示回溯并帶有一些調(diào)試信息。
defaults.permission_denied(request, template_name='403.html')
與404 和500 視圖一樣,Django 具有一個(gè)處理403 Forbidden 錯(cuò)誤的視圖。如果一個(gè)視圖導(dǎo)致一個(gè)403 視圖,那么Django 將默認(rèn)調(diào)用django.views.defaults.permission_denied視圖。
該視圖加載并渲染你的根模板目錄下的403.html,如果這個(gè)文件不存在則根據(jù)RFC 2616(HTTP 1.1 Specification)返回“403 Forbidden”文本。
django.views.defaults.permission_denied 通過PermissionDenied 異常觸發(fā)。若要拒絕訪問一個(gè)視圖,你可以這樣視圖代碼:
from django.core.exceptions import PermissionDenied
def edit(request, pk):
if not request.user.is_staff:
raise PermissionDenied
# ...
defaults.bad_request(request, template_name='400.html')
當(dāng)Django 中引發(fā)一個(gè)SuspiciousOperation 時(shí),它可能通過Django 的一個(gè)組件處理(例如重設(shè)會(huì)話的數(shù)據(jù))。如果沒有特殊處理,Django 將認(rèn)為當(dāng)前的請(qǐng)求時(shí)一個(gè)'bad request' 而不是一個(gè)server error。
django.views.defaults.bad_request 和server_error 視圖非常相似,除了返回400 狀態(tài)碼來表示錯(cuò)誤來自客戶端的操作。
bad_request 視圖同樣只是在DEBUG 為False 時(shí)使用。
譯者:Django 文檔協(xié)作翻譯小組,原文:Built-in Views。
本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請(qǐng)保留作者署名和文章出處。
Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。