django1.8 view(3): View functions

本文翻译自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'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值