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