有幾個Django 的內(nèi)建視圖在編寫視圖 中講述,文檔的其它地方也會有所講述。
static.serve(request, path, document_root, show_indexes=False)
在本地的開發(fā)環(huán)境中,除了你的項目中的靜態(tài)文件,可能還有一些文件,出于方便,你希望讓Django 來作為服務器。serve() 視圖可以用來作為任意目錄的服務器。(該視圖不能用于生產(chǎn)環(huán)境,應該只用于開發(fā)時輔助使用;在生產(chǎn)環(huán)境中你應該使用一個真實的前端Web 服務器來服務這些文件)。
最常見的例子是用戶上傳文檔到MEDIA_ROOT 中。django.contrib.staticfiles 用于靜態(tài)文件且沒有對用戶上傳的文件做處理,但是你可以通過在URLconf 中添加一些內(nèi)容來讓Django 作為MEDIA_ROOT 的服務器:
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,
}),
]
注意,這里的代碼片段假設你的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 原生自帶幾個默認視圖用于處理HTTP 錯誤。若要使用你自定義的視圖覆蓋它們,請參見自定義錯誤視圖。
defaults.page_not_found(request, template_name='404.html')
當你在一個視圖中引發(fā)Http404 時,Django 將加載一個專門的視圖用于處理404 錯誤。默認為django.views.defaults.page_not_found() 視圖,它產(chǎn)生一個非常簡單的“Not Found” 消息或者渲染404.html模板,如果你在根模板目錄下創(chuàng)建了它的話。
默認的404 視圖將傳遞一個變量給模板:request_path,它是導致錯誤的URL。
關于404 視圖需要注意的3點:
RequestContext并且可以訪問模板上下文處理器提供的變量(例如MEDIA_URL)。True(在你的settings 模塊中),那么將永遠不會調(diào)用404 視圖,而是顯示你的URLconf 并帶有一些調(diào)試信息。defaults.server_error(request, template_name='500.html')
類似地,在視圖代碼中出現(xiàn)運行時錯誤,Django 將執(zhí)行特殊情況下的行為。如果一個視圖導致異常,Django 默認情況下將調(diào)用django.views.defaults.server_error 視圖,它產(chǎn)生一個非常簡單的“Server Error” 消息或者渲染500.html,如果你在你的根模板目錄下定義了它的話。
默認的500 視圖不會傳遞變量給500.html 模板,且使用一個空Context 來渲染以減少再次出現(xiàn)錯誤的可能性。
如果DEBUG 設置為True(在你的settings 模塊中),那么將永遠不會調(diào)用500 視圖,而是顯示回溯并帶有一些調(diào)試信息。
defaults.permission_denied(request, template_name='403.html')
與404 和500 視圖一樣,Django 具有一個處理403 Forbidden 錯誤的視圖。如果一個視圖導致一個403 視圖,那么Django 將默認調(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')
當Django 中引發(fā)一個SuspiciousOperation 時,它可能通過Django 的一個組件處理(例如重設會話的數(shù)據(jù))。如果沒有特殊處理,Django 將認為當前的請求時一個'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。