编写视图

视图函数或简称view简单地说就是一个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模块以及Python的datetime库中导入类HttpResponse

  • 接下来,我们定义一个名为current_datetime的函数。 这是查看功能。 每个视图函数都将一个HttpRequest对象作为其第一个参数,通常称为request

    请注意,视图函数的名称并不重要;为了使Django能够识别它,它不必以某种方式命名。 我们在这里称之为current_datetime,因为这个名字清楚地表明了它的作用。

  • 该视图返回包含生成的响应的HttpResponse对象。 每个视图函数负责返回一个HttpResponse对象。 (有一些例外,但我们会在稍后讨论)

Django的时区

Django includes a TIME_ZONE setting that defaults to America/Chicago. 这可能不是你住的地方,所以你可能想在你的设置文件中改变它。

将URL映射到视图

所以,回顾一下,这个视图函数返回一个包含当前日期和时间的HTML页面。 要在特定的URL上显示这个视图,你需要创建一个URLconf;有关说明,请参阅URL dispatcher

返回错误

在Django中返回HTTP错误代码很容易。 There are subclasses of HttpResponse for a number of common HTTP status codes other than 200 (which means “OK”). 您可以在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>')

对于每个可能的HTTP响应代码都没有专门的子类,因为其中很多不会是那么常见的。 但是,如HttpResponse文档中所述,您还可以将HTTP状态代码传递给HttpResponse的构造函数,以便为您喜欢的任何状态代码创建返回类。 例如:

from django.http import HttpResponse

def my_view(request):
    # ...

    # Return a "created" (201) response code.
    return HttpResponse(status=201)

因为404错误是迄今为止最常见的HTTP错误,所以有一个更简单的方法来处理这些错误。

Http404异常

django.http。 HTTP404 T0> ¶ T1>

当你返回错误如HttpResponseNotFound时,你需要负责定义错误页面的HTML:

return HttpResponseNotFound('<h1>Page not found</h1>')

为了方便起见,因为在您的站点上有一致的404错误页面是一个好主意,Django提供了一个Http404异常。 如果你在视图函数中的任何一点都提示Http404,Django将会捕获它并返回你的应用程序的标准错误页面以及一个HTTP错误代码404。

用法示例:

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中指定处理程序(在其他地方将其设置为无效)。

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'

也可以看看

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