Code前端首页关于Code前端联系我们

Django 教程:介绍和使用视图

terry 2年前 (2023-09-24) 阅读数 146 #后端开发

Django 是一个非常流行的 Python Web 框架,它允许开发人员轻松构建功能强大的 Web 应用程序。在上一篇文章中,我们介绍了Python模型以及如何使用它们。在这篇文章中,我将详细介绍 Django 视图的概念和用法,并通过一些示例代码来加深我们对 Django 视图的理解。

视图是 Django 中处理 HTTP 请求并生成 HTTP 响应的函数或方法。它们负责处理用户请求并返回相应的内容。要创建视图,您必须定义函数或方法并将其绑定到 URL。 Django教程:视图介绍及使用ai艺术

1。定义视图

首先,在 Django 项目的根目录中创建一个名为 views.py 的文件。在这个文件中我们定义了我们的视图。

# 在views.py中引入必要的模块from django.shortcuts import renderfrom django.http import HttpResponsefrom bbs import Post# Create your views here.
def hello(request):    return HttpResponse("Hello, Django !")
def get_post(request, title):    # 从数据库中获取用户数据    post= Post.objects.get(title=title)    # 将数据传递给模板,渲染页面    return render(request, 'post.html', {'post': post})

在上面的代码示例中,我们定义了两个视图函数。第一个函数hello接受请求并返回一个简单的HttpResponse♶❗,其中包含文本Django!

第二个视图函数get_post接收两个参数:request对象和

其请求来自数据库,rit title 对应的用户数据并将它们传递给渲染一个名为 post.html 的模板文件。

2。 URL 映射

接下来,我们需要将这些视图映射到 urls.py 中相应的 URL。

from django.urls import pathfrom . import views
urlpatterns = [    path('hello/', views.hello, name='hello'),    path('post/<str:title>/', views.title, name='get_post'),]

在上面的代码中,我们使用函数path将URL映射到相应的视图函数。第一个 URL 模式将视图 hello/ 与函数 hello 相关联。第二个 URL 模式将 post/ 之后的部分 title 传递到视图函数 get_postDjango教程:视图介绍及使用django 你好

3。视图装饰器

Django 提供了一些常用的视图装饰器,可用于添加额外的功能或检查授权。

from django.contrib.auth.decorators import login_required
@login_requireddef protected_view(request):    return HttpResponse("This view requires authentication.")

目前,我们只需要对装饰器有一个大概的了解,并知道有这样的东西存在即可。下面的内容详细讲解了装饰器的应用场景。

4。模板渲染

Django 的模板引擎允许将动态数据输入到 HTML 模板中并呈现给用户。首先,我们需要在目录bbs中创建一个目录 。遵循配置约定,Django 在此目录中搜索模板文件。为什么?还记得我们经常提到的 settings.py 文件吗?默认设置文件将后端 DjangoTemplates 和 APP_DIRS[1] 设置为 True。此选项使 DjangoTemplates 在每个 INSTALLED_APPS[2] 文件夹中查找“templates”子目录。

TEMPLATES = [    {        'BACKEND': 'django.template.backends.django.DjangoTemplates',        'DIRS': [],        'APP_DIRS': True,        'OPTIONS': {            'context_processors': [                'django.template.context_processors.debug',                'django.template.context_processors.request',                'django.contrib.auth.context_processors.auth',                'django.contrib.messages.context_processors.messages',            ],        },    },]

在新建的templates目录下,新建一个文件夹post来存放我们的模板文件。

<html><head>    <title>内容列表</title></head>
<body>    {% for post in posts %}    <h2>{{ post.title }}</h2>    <div>        {{ post.content }}    </div>    {% endfor %}</body></html>

views.py中,我们的视图函数可以编写如下,将请求对象post传递给图章♓/in.html。渲染页面如图:Django教程:视图介绍及使用django

5。基于类的视图

Django 提供了适合许多应用程序的基本视图类。所有视图都继承自 View 类,该类处理将视图链接到 URL、调度 HTTP 方法和其他简单功能。 RedirectView 用于 HTTP 重定向,TemplateView 扩展基类以允许其渲染模板。

urlpattern = [    path("bbs/about/", TemplateView.as_view(template_name="about.html")),]

传递给 as_view() 的所有参数都会覆盖分配给该类的属性。在此示例中,我们在 TemplateView 中设置 template_name 以用于呈现 about.html 模板。当然,我们也可以继承现有的视图并重写子类中的属性以提供新的值或方法。Django教程:视图介绍及使用django模板

6.404异常处理对于

404异常,我们可以用下面的代码来处理:

def get_post_if_404(request, title):    try:        post = Post.objects.get(title = title)    except Post.DoesNotExist:        raise Http404("Post Not Exist")    return render(request, 'post/detail.html', {'post': post})

为什么Django提供了更方便的功能来帮助我们处理此类异常:me。辅助函数get_object_or_404()而不是捕获异常ObjectDoesNotExist?为什么模型API不直接抛出ObjectDoesNotExist,而是抛出Http404

因为它增加了模型层和视图层之间的联系。指导 Django 设计的最重要思想之一是确保松耦合。

7。请参阅测试

测试是软件开发中非常重要的过程,尽管测试并不会让我们的程序表现得更好或更完美。但对于中大型软件来说,编写自动化测试的测试用例是非常重要的。如果不通过用例来进行测试,就意味着我们花费了大量的时间来验证程序的功能。

按照惯例,Django 应用程序的测试应编写在应用程序的tests.py 文件中。测试系统从测试开始自动搜索并运行所有文件中的测试代码。对于视图测试,Django 提供了一个测试客户端来模拟用户与视图层代码的交互。

def save_post(title, content, pub_date):    return Post.objects.create(title= title, content = content, pub_date = pub_date)
# Create your tests here.from django.test import TestCasefrom django.utils import timezonefrom django.urls import reverseimport datetimefrom bbs.models import Post

def save_post(title, content, pub_date):    return Post.objects.create(title= title, content = content, pub_date = pub_date)
# Create your tests here.class PostModelTests(TestCase):     def test_post_insert_with_future_pub_date(self):
        pub_date = timezone.now() + datetime.timedelta(days=-20)        # future_post = Post(title = '测试Post', content='测试内容', pub_date=pub_date)        # self.assertIs(future_post.pub_date_valid(), True)        future_post = save_post(title = '测试Post', content='测试内容', pub_date=pub_date)        # 测试路由是否可被访问        url = reverse("post_detail", args=(future_post.title,))        response = self.client.get(url)        self.assertEqual(response.status_code, 200)

通过从命令行运行来运行我们的测试用例:python manage.py test bbsDjango教程:视图介绍及使用django 测试

8。总结

Django视图是Django框架中非常重要的一部分。它负责接收用户请求并返回相应的响应。在Django中,视图可以分为两种类型:类视图和函数视图。 View类继承自Django的View类,并提供一些处理请求和响应的通用方法。函数视图是直接接收请求并返回响应的简单方法。

除了类视图之外,Django还提供了一些其他视图类型,例如TemplateView。 TemplateView 可以呈现并返回模板作为响应。为了方便大家学习,我在Github上新建了一个仓库[3]来存放文章中的源码,供大家参考。

总之,Django视图是Django框架中非常重要的一部分,提供了许多有用的方法来处理请求和响应,并且可以轻松地与其他功能(例如URL映射和模板引擎)集成。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门