写入视图

一个视图函数,简称视图,是一个简单的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页面。 要在特定URL显示此视图,您需要创建一个URLconf;有关说明,请参阅URL dispatcher

返回错误

在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
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(request, 'polls/detail.html', {'poll': p})

为了在Django返回404时显示自定义的HTML,您可以创建一个名为404.html的HTML模板,并将其放置在模板树的顶层。 DEBUG设置为False时,此模板将被提供。

DEBUGTrue时,您可以向Http404提供消息,它将显示在标准的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'

请参见

使用CSRF_FAILURE_VIEW设置覆盖CSRF错误视图。