Django 教程:介绍和使用视图
Django 是一个非常流行的 Python Web 框架,它允许开发人员轻松构建功能强大的 Web 应用程序。在上一篇文章中,我们介绍了Python模型以及如何使用它们。在这篇文章中,我将详细介绍 Django 视图的概念和用法,并通过一些示例代码来加深我们对 Django 视图的理解。
视图是 Django 中处理 HTTP 请求并生成 HTTP 响应的函数或方法。它们负责处理用户请求并返回相应的内容。要创建视图,您必须定义函数或方法并将其绑定到 URL。 ai艺术
1。定义视图
首先,在 Django 项目的根目录中创建一个名为 views.py
的文件。在这个文件中我们定义了我们的视图。
# 在views.py中引入必要的模块
from django.shortcuts import render
from django.http import HttpResponse
from 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!
其请求来自数据库,rit get_post
接收两个参数:request
对象和title
对应的用户数据并将它们传递给渲染一个名为 post.html
的模板文件。
2。 URL 映射
接下来,我们需要将这些视图映射到 urls.py
中相应的 URL。
from django.urls import path
from . 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_post
。 django 你好
3。视图装饰器
Django 提供了一些常用的视图装饰器,可用于添加额外的功能或检查授权。
from django.contrib.auth.decorators import login_required
@login_required
def 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
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模板
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 TestCase
from django.utils import timezone
from django.urls import reverse
import datetime
from 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 bbs
。 django 测试
8。总结
Django视图是Django框架中非常重要的一部分。它负责接收用户请求并返回相应的响应。在Django中,视图可以分为两种类型:类视图和函数视图。 View类继承自Django的View类,并提供一些处理请求和响应的通用方法。函数视图是直接接收请求并返回响应的简单方法。
除了类视图之外,Django还提供了一些其他视图类型,例如TemplateView。 TemplateView 可以呈现并返回模板作为响应。为了方便大家学习,我在Github上新建了一个仓库[3]来存放文章中的源码,供大家参考。
总之,Django视图是Django框架中非常重要的一部分,提供了许多有用的方法来处理请求和响应,并且可以轻松地与其他功能(例如URL映射和模板引擎)集成。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。