鍍金池/ 教程/ Python/ 內(nèi)建的視圖
編寫自定義存儲系統(tǒng)
高級
編寫你的第一個Django應(yīng)用,第5部分
視圖層
Django管理文檔生成器
編寫你的第一個 Django 程序 第3部分
編寫你的第一個Django應(yīng)用,第6部分
模型層
中間件
測試
數(shù)據(jù)庫訪問優(yōu)化
文件上傳
中間件
驗證器
基于類的內(nèi)建通用視圖
部署靜態(tài)文件
使用Django認(rèn)證系統(tǒng)
高級教程:如何編寫可重用的應(yīng)用
Model 類參考
Django 初探
使用Django輸出PDF
模型的實例
模型
文件上傳
進(jìn)行原始的sql查詢
面向程序員
中間件
編寫數(shù)據(jù)庫遷移
TemplateResponse 和 SimpleTemplateResponse
異常
Django中的測試
基礎(chǔ)
管理器
File對象
URL調(diào)度器
加密簽名
國際化和本地化
日志
查詢集
django-admin 和 manage.py
使用基于類的視圖處理表單
聚合
內(nèi)建基于類的視圖的API
如何使用會話
部署 Django
其它
其它核心功能
高級
Django中的密碼管理
模型元選項
按需內(nèi)容處理
查找 API 參考
高級
Django 的快捷函數(shù)
Django 的設(shè)置
Admin
開發(fā)過程
新手入門
基于類的視圖
模型實例參考
信號
表單素材 ( <code>Media</code> 類)
自定義查找
常見的網(wǎng)站應(yīng)用工具
模型
django.contrib.humanize
Django模版語言
點擊劫持保護(hù)
管理操作
編寫你的第一個 Django 程序 第2部分
Django安全
模式編輯器
多數(shù)據(jù)庫
部署
基于類的視圖
內(nèi)建的視圖
視圖裝飾器
面向設(shè)計師
編寫視圖
應(yīng)用程序
如何使用WSGI 部署
參考
表單 API
文件儲存API
認(rèn)證
國際化和本地化
錯誤報告
基礎(chǔ)
基礎(chǔ)
將遺留數(shù)據(jù)庫整合到Django
教程
Django異常
編寫你的第一個 Django 程序 第4部分
遷移
分頁
重定向應(yīng)用
表單
從零開始
為模型提供初始數(shù)據(jù)
設(shè)置
使用Django輸出CSV
關(guān)聯(lián)對象參考
使用表單
Django 中的用戶認(rèn)證
快速安裝指南
安全問題歸檔
數(shù)據(jù)庫函數(shù)
編寫自定義的django-admin命令
高級教程
管理文件
格式本地化
基于類的通用視圖 —— 索引
安全
系統(tǒng)檢查框架
為Django編寫首個補(bǔ)丁
模板層
Widgets
編寫你的第一個 Django 程序 第1部分
執(zhí)行查詢

內(nèi)建的視圖

有幾個Django 的內(nèi)建視圖在編寫視圖 中講述,文檔的其它地方也會有所講述。

開發(fā)環(huán)境中的文件服務(wù)器

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 錯誤。若要使用你自定義的視圖覆蓋它們,請參見自定義錯誤視圖。

404 (page not found) 視圖

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點:

  • 如果Django 在檢測URLconf 中的每個正則表達(dá)式后沒有找到匹配的內(nèi)容也將調(diào)用404 視圖。
  • 404 視圖會被傳遞一個RequestContext并且可以訪問模板上下文處理器提供的變量(例如MEDIA_URL)。
  • 如果DEBUG 設(shè)置為True(在你的settings 模塊中),那么將永遠(yuǎn)不會調(diào)用404 視圖,而是顯示你的URLconf 并帶有一些調(diào)試信息。

500 (server error) 視圖

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)試信息。

403 (HTTP Forbidden) 視圖

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

400 (bad request) 視圖

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 視圖同樣只是在DEBUGFalse 時使用。

譯者:Django 文檔協(xié)作翻譯小組,原文:Built-in Views。

本文以 CC BY-NC-SA 3.0 協(xié)議發(fā)布,轉(zhuǎn)載請保留作者署名和文章出處。

Django 文檔協(xié)作翻譯小組人手緊缺,有興趣的朋友可以加入我們,完全公益性質(zhì)。交流群:467338606。