Skip to main content

写视图

视图函数(简称 view)只是一个Python函数,它接收Web请求并返回Web响应。此响应可以是网页的HTML内容,重定向或404错误,或XML文档或图像。 。 。或任何东西,真的。视图本身包含返回该响应所需的任何逻辑。这个代码可以生活在任何你想要的,只要它在你的Python路径。没有其他要求 - 没有“魔法”,可以这么说。为了放置代码 somewhere,约定是将视图放在一个名为 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包括一个默认为 America/ChicagoTIME_ZONE 设置。这可能不是你住的地方,所以你可能想在你的设置文件中更改它。

将网址映射到视图

因此,要回顾一下,此视图函数将返回包含当前日期和时间的HTML页面。要在特定URL显示此视图,您需要创建 URLconf;有关说明,请参阅 网址调度员

返回错误

在Django中返回HTTP错误代码很容易。对于除了200(这意味着 “OK”)之外的多个公共HTTP状态码,存在 HttpResponse 的子类。您可以在 请求/响应 文档中找到可用子类的完整列表。只返回其中一个子类的实例,而不是一个正常的 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 异常

class django.http.Http404

当您返回错误(如 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错误视图。