Django 2.1.3 视图层 视图函数

模型层 | 总目录 | 快捷函数


视图函数或简称视图 只是一个Python函数,它接受Web请求并返回Web响应。此响应可以是HTML网页的内容,重定向,404错误,XML文档或图像,或者其他什么。视图本身包含返回该响应所需的任意逻辑。这段代码可以存在于任何你想要的地方,只要它在你的Python路径上。没有其他要求 - 可以这么说。为了将代码放在某处,惯例是将视图放在一个名为views.py的文件中。

1.一个简单的视图

这是一个返回当前日期和时间的视图,以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)

让我们逐行分析此代码:

1 . 首先,我们从 django.http模块中导入HttpResponse类,以及Python的datetime库。

2 . 接下来,我们定义一个名为current_datetime的函数,这是视图视图。每个视图函数都将一个HttpRequest 对象作为其第一个参数,通常将其命名为 request。

请注意,视图函数的名称无关紧要; 它不必以某种方式命名,以便Django识别它。我们把它命名为current_datetime,因为这个名字清楚地表明了它的作用。

3 . 视图返回包含生成响应(HttpResponse)的对象。每个视图函数负责返回一个HttpResponse对象。(也有例外,但我们稍后会介绍。)

Django的时区
Django默认设置TIME_ZONEAmerica/Chicago。这可能不是您居住的地方,因此您可能希望在设置文件中更改它。

2. 将URL映射到视图

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

3. 返回错误

在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状态代码传递给构造函数, 以便为您喜欢的任何状态代码创建返回类。例如:

from django.http import HttpResponse

def my_view(request):
    # ...

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

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

3.1 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这个404模板将会成为一个全局的404页面。
在这里插入图片描述
如果DEBUG=True,你可以提供一个消息Http404,它会出现在标准404调试模板(系统的404模板)。使用这些消息进行调试; 它们通常不适合用于生产的404模板。

4. 自定义错误视图

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错误视图。

4.1测试自定义错误视图

要测试自定义错误处理程序的响应,请在测试视图中引发相应的异常。例如:

# 一个视图文件中
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse

def response_error_handler(request, exception=None):
    return HttpResponse('Error handler content', status=403)


def permission_denied_view(request):
    raise PermissionDenied

# app的urls.py文件中,
urlpatterns = [
    path('403/', permission_denied_view),
]
# 全局的urls.py文件中
handler403 = response_error_handler

在这里插入图片描述
在你的测试程序中,要这么写TestCase:

from django.test import SimpleTestCase, override_settings
# ROOT_URLCONF must specify the module that contains handler403 = ...
@override_settings(ROOT_URLCONF=__name__)
class CustomErrorHandlerTests(SimpleTestCase):

    def test_handler_renders_template_response(self):
        response = self.client.get('/403/')
        # Make assertions on the response here. For example:
        self.assertContains(response, 'Error handler content', status_code=403)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值