# 內建的視圖 #
有幾個Django 的內建視圖在編寫視圖 中講述,文檔的其它地方也會有所講述。
## 開發環境中的文件服務器 ##
**static.serve(request, path, document_root, show_indexes=False)**
在本地的開發環境中,除了你的項目中的靜態文件,可能還有一些文件,出于方便,你希望讓Django 來作為服務器。serve() 視圖可以用來作為任意目錄的服務器。(該視圖不能用于生產環境,應該只用于開發時輔助使用;在生產環境中你應該使用一個真實的前端Web 服務器來服務這些文件)。
最常見的例子是用戶上傳文檔到`MEDIA_ROOT` 中。`django.contrib.staticfiles` 用于靜態文件且沒有對用戶上傳的文件做處理,但是你可以通過在URLconf 中添加一些內容來讓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/'`。它將調用`serve()` 視圖,傳遞來自URLconf 的路徑和(必選的)`document_root` 參數。
因為定義這個URL 模式顯得有些笨拙,Django 提供一個小巧的URL 輔助函數`static()`,它接收`MEDIA_URL`這樣的參數作為前綴和視圖的路徑如`'django.views.static.serve'`。其它任何函數參數都將透明地傳遞給視圖。
## 錯誤視圖 ##
Django 原生自帶幾個默認視圖用于處理HTTP 錯誤。若要使用你自定義的視圖覆蓋它們,請參見自定義錯誤視圖。
### 404 (page not found) 視圖 ###
**defaults.page_not_found(request, template_name='404.html')**
當你在一個視圖中引發Http404 時,Django 將加載一個專門的視圖用于處理404 錯誤。默認為`django.views.defaults.page_not_found()` 視圖,它產生一個非常簡單的“Not Found” 消息或者渲染`404.html`模板,如果你在根模板目錄下創建了它的話。
默認的404 視圖將傳遞一個變量給模板:`request_path`,它是導致錯誤的URL。
關于404 視圖需要注意的3點:
+ 如果Django 在檢測URLconf 中的每個正則表達式后沒有找到匹配的內容也將調用404 視圖。
+ 404 視圖會被傳遞一個`RequestContext`并且可以訪問模板上下文處理器提供的變量(例如`MEDIA_URL`)。
+ 如果DEBUG 設置為`True`(在你的`settings` 模塊中),那么將永遠不會調用404 視圖,而是顯示你的URLconf 并帶有一些調試信息。
### 500 (server error) 視圖 ###
**defaults.server_error(request, template_name='500.html')**
類似地,在視圖代碼中出現運行時錯誤,Django 將執行特殊情況下的行為。如果一個視圖導致異常,Django 默認情況下將調用`django.views.defaults.server_error` 視圖,它產生一個非常簡單的“Server Error” 消息或者渲染`500.html`,如果你在你的根模板目錄下定義了它的話。
默認的500 視圖不會傳遞變量給`500.html` 模板,且使用一個空`Context` 來渲染以減少再次出現錯誤的可能性。
如果`DEBUG` 設置為`True`(在你的`settings` 模塊中),那么將永遠不會調用500 視圖,而是顯示回溯并帶有一些調試信息。
### 403 (HTTP Forbidden) 視圖 ###
**defaults.permission_denied(request, template_name='403.html')**
與404 和500 視圖一樣,Django 具有一個處理403 Forbidden 錯誤的視圖。如果一個視圖導致一個403 視圖,那么Django 將默認調用`django.views.defaults.permission_denied`視圖。
該視圖加載并渲染你的根模板目錄下的`403.html`,如果這個文件不存在則根據RFC 2616(HTTP 1.1 Specification)返回“403 Forbidden”文本。
`django.views.defaults.permission_denied` 通過`PermissionDenied` 異常觸發。若要拒絕訪問一個視圖,你可以這樣視圖代碼:
```
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')**
當Django 中引發一個`SuspiciousOperation` 時,它可能通過Django 的一個組件處理(例如重設會話的數據)。如果沒有特殊處理,Django 將認為當前的請求時一個'bad request' 而不是一個server error。
`django.views.defaults.bad_request` 和server_error 視圖非常相似,除了返回400 狀態碼來表示錯誤來自客戶端的操作。
`bad_request` 視圖同樣只是在`DEBUG` 為`False` 時使用。
> 譯者:[Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html),原文:[Built-in Views](https://docs.djangoproject.com/en/1.8/ref/views/)。
>
> 本文以 [CC BY-NC-SA 3.0](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/) 協議發布,轉載請保留作者署名和文章出處。
>
> [Django 文檔協作翻譯小組](http://python.usyiyi.cn/django/index.html)人手緊缺,有興趣的朋友可以加入我們,完全公益性質。交流群:467338606。
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第1部分:模型
- 第2部分:管理站點
- 第3部分:視圖和模板
- 第4部分:表單和通用視圖
- 第5部分:測試
- 第6部分:靜態文件
- 高級教程
- 如何編寫可重用的應用
- 為Django編寫首個補丁
- 模型層
- 模型
- 模型語法
- 元選項
- 模型類
- 查詢集
- 執行查詢
- 查找表達式
- 模型的實例
- 實例方法
- 訪問關聯對象
- 遷移
- 模式編輯器
- 編寫遷移
- 高級
- 管理器
- 原始的SQL查詢
- 聚合
- 多數據庫
- 自定義查找
- 條件表達式
- 數據庫函數
- 其它
- 遺留的數據庫
- 提供初始數據
- 優化數據庫訪問
- 視圖層
- 基礎
- URL配置
- 視圖函數
- 快捷函數
- 裝飾器
- 參考
- 內建的視圖
- TemplateResponse 對象
- 文件上傳
- 概覽
- File 對象
- 儲存API
- 管理文件
- 自定義存儲
- 基于類的視圖
- 概覽
- 內建顯示視圖
- 內建編輯視圖
- API參考
- 分類索引
- 高級
- 生成 CSV
- 生成 PDF
- 中間件
- 概覽
- 內建的中間件類
- 模板層
- 基礎
- 面向設計師
- 語言概覽
- 人性化
- 面向程序員
- 表單
- 基礎
- 概覽
- 表單API
- 內建的Widget
- 高級
- 整合媒體
- 開發過程
- 設置
- 概覽
- 應用程序
- 異常
- 概覽
- django-admin 和 manage.py
- 添加自定義的命令
- 測試
- 介紹
- 部署
- 概述
- WSGI服務器
- 部署靜態文件
- 通過email追蹤代碼錯誤
- Admin
- 管理操作
- 管理文檔生成器
- 安全
- 安全概述
- 說明Django中的安全問題
- 點擊劫持保護
- 加密簽名
- 國際化和本地化
- 概述
- 本地化WEB UI格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架