# 編寫視圖 #
一個視圖函數,或者簡短來說叫做視圖,是一個簡單的Python函數,它接受web請求,并且返回web響應。響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片. . . 是任何東西都可以。無論視圖本身包含什么邏輯,都要返回響應。代碼寫在哪里也無所謂,只要它在你的Python目錄下面。除此之外沒有更多的要求了——可以說“沒有什么神奇的地方”。為了能夠把代碼放在某個地方,慣例是把視圖放在叫做views.py的文件中,然后把它放到你的項目或者應用目錄里。
## 一個簡單的視圖 ##
下面是一個返回當前日期和時間作為HTML文檔的視圖:
```
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
```
讓我們逐行閱讀上面的代碼:
+ 首先,我們從 django.http模塊導入了HttpResponse類,以及Python的datetime庫。
+ 接著,我們定義了current_datetime函數。它是一個視圖函數。每個視圖函數都應接收HttpRequest對象作為第一個參數,一般叫做request。
+ 注意視圖函數的名稱并不重要;不需要用一個統一的命名方式來命名,以便讓Django識別它。我們將其命名為current_datetime,是因為這個名稱能夠精確地反映出它的功能。
+ 這個視圖會返回一個HttpResponse對象,其中包含生成的響應。每個視圖函數都要返回HttpResponse對象。(有例外,我們接下來會講。)
> Django中的時區
>
> Django中包含一個TIME_ZONE設置,默認為America/Chicago。可能并不是你住的地方,所以你可能會在設置文件里修改它。
## 把你的URL映射到視圖 ##
所以,再重復一遍,這個視圖函數返回了一個包含當前日期和時間的HTML頁面。你需要創建URLconf來展示在特定的URL這一視圖; 詳見URL 分發器。
## 返回錯誤 ##
在Django中返回HTTP錯誤是相當容易的。有一些HttpResponse的子類代表不是200(“OK”)的HTTP狀態碼。你可以在request/response文檔中找到所有可用的子類。你可以返回那些子類的一個實例,而不是普通的HttpResponse ,來表示一個錯誤。例如:
```
from django.http import HttpResponse, HttpResponseNotFound
def my_view(request):
# ...
if foo:
return HttpResponseNotFound('<h1>Page not found</h1>')
else:
return HttpResponse('<h1>Page was found</h1>')
```
由于一些狀態碼不太常用,所以不是每個狀態碼都有一個特化的子類。然而,如HttpResponse文檔中所說的那樣,你也可以向HttpResponse的構造器傳遞HTTP狀態碼,來創建你想要的任何狀態碼的返回類。例如:
```
from django.http import HttpResponse
def my_view(request):
# ...
# Return a "created" (201) response code.
return HttpResponse(status=201)
```
由于404錯誤是最常見的HTTP錯誤,所以處理這一錯誤的方式非常便利。
## Http404異常 ##
**class django.http.Http404**
當你返回一個像HttpResponseNotFound這樣的錯誤時,它會輸出這個錯誤頁面的HTML作為結果:
```
return HttpResponseNotFound('<h1>Page not found</h1>')
```
為了便利起見,也因為你的站點有個一致的404頁面是個好主意,Django提供了Http404異常。如果你在視圖函數中的任何地方拋出Http404異常,Django都會捕獲它,并且帶上HTTP404錯誤碼返回你應用的標準錯誤頁面。
像這樣:
```
from django.http import Http404
from django.shortcuts import render_to_response
from polls.models import Poll
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404("Poll does not exist")
return render_to_response('polls/detail.html', {'poll': p})
```
為了盡可能利用 Http404,你應該創建一個用來在404錯誤產生時展示的模板。這個模板應該叫做404.html,并且在你的模板樹中位于最頂層。
如果你在拋出Http404異常時提供了一條消息,當DEBUG為True時它會出現在標準404模板的展示中。你可以將這些消息用于調試;但他們通常不適用于404模板本身。
## 自定義錯誤視圖 ##
Django中默認的錯誤視圖對于大多數web應用已經足夠了,但是如果你需要任何自定義行為,重寫它很容易。只要在你的URLconf中指定下面的處理器(在其他任何地方設置它們不會有效)。
handler404覆蓋了page_not_found()視圖:
```
handler404 = 'mysite.views.my_custom_page_not_found_view'
```
handler500覆蓋了server_error()視圖:
```
handler500 = 'mysite.views.my_custom_error_view'
```
handler403覆蓋了permission_denied()視圖:
```
handler403 = 'mysite.views.my_custom_permission_denied_view'
```
handler400覆蓋了bad_request()視圖:
```
handler400 = 'mysite.views.my_custom_bad_request_view'
```
- 新手入門
- 從零開始
- 概覽
- 安裝
- 教程
- 第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格式化輸入
- “本地特色”
- 常見的網站應用工具
- 認證
- 概覽
- 使用認證系統
- 密碼管理
- 日志
- 分頁
- 會話
- 數據驗證
- 其它核心功能
- 按需內容處理
- 重定向
- 信號
- 系統檢查框架