本文翻译自django1.8.2官方文档The view layer中的View functions段
Writing views
一个视图函数,或者简称视图,简单的说,就是一个接受WEB请求并响应的Python函数.响应可以是网页的HTML内容,或者是重定向,或者是404错误,或者是XML文档,或者是一个图片,或者其他任何东西,真的.视图能写任何需要的逻辑来返回响应.代码可以写在任何地方,只要在python path里.没有其他的依赖项-There’s no other requirement–no “magic,” so to speak.代码总得放在一个地方吧,最好的地方是工程或应用目录下的叫views.py的文件.
A simple view
这是一个视图,以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.这很可能不是你住的地方,所以你很可能要更改这个设定.
Mapping URLs to views
So, to recap, this view function returns an HTML page that includes the current date and time. To display this view at a particular URL, you’ll need to create a URLconf; see URL dispatcher for instructions.
Returning errors
在django里返回HTTP错误代码很容易.HttpResponse有很多子类,有公共的HTTP状态码,而不是只有200(意思是’ok’).你可以在request/response文档里找到完整的可用的子类清单.只需要返回其中一个子类的实例而不是普通的HttpResponse就能表示一个错误.例如:
from django.http import HttpResponse, HttpResponseNotFound
def my_view(request):
# ...
if foo:
return HttpResponseNotFount("<h1>Page not found</h1>")
else:
return HttpResponse("<h1>Page was found</h1>")
不是每种HTTP响应状态码都有一个对应的子类,因为大部分都不常用.但是,就像在HttpResponse文档中介绍的那样,你可以将HTTP状态码传递到HttpResponse的构造器里,这样你就能为任何状态码创建可以返回的HttpResponse类.例如:
from django.http import HttpResponse
def my_view(request):
# ...
# Return a "created"(201)response code
return HttpResponse(status=201)
因为404错误是最常见的HTTP错误,有更好的方法处理404错误.
The Http404 exception
- class django.http.Http404
当你返回一个像HttpResponseNotFound这样的错误时,你必须要构造一个错误页面的HTML:
return HttpResponseNotFound('<h1>Page not found</h1>')
为了方便和整个站点有统一的404错误页面,django提供了一个Http404异常.如果你在视图函数的任何位置抛出Http404异常,django会捕获这个异常,并且返回标准的有404状态码错误页面.
用法示例:
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)
exception Poll.DoesNotExist:
raise Http404('Poll doen not exist')
return render_ro_response('polls/detail.html', {'poll': p})
想要使用Http404异常的完整功能,你应该创建当404错误出现时显示的模板.这个模板可以叫404.html并放在模板目录的顶层
如果当404异常出现时你提供了信息,信息在DEBUG=False时会显示在标准404模板里.这些信息一般用作debug,通常在生产环境下不这么用.
Customizing error views
django的默认错误视图能满足大部分WEB应用的需要,但是你也可以很容易的改写,在需要的时候.简单的方法是在URLconf(在哪里都可以)里定制,就像下面这样.
page_not_found()视图被handler404覆盖:
handler404 = 'mysite.views.my_custom_page_not_found_view'
server_error()视图被handler500覆盖:
handler500 = 'mysite.views.my_custom_error_view'
permission_denied()视图被handler403覆盖:
handler403 = 'mysite.views.my_custom_permission_denied_view'
bad_request()被handler400覆盖:
handler400 = 'mysite.views.my_custom_bad_request_view'