Django视图与URLs路由详解

王柳  论坛元老 | 2024-7-26 20:36:05 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1009|帖子 1009|积分 3027

        在Django Web框架中,视图(Views)和URLs路由(URL routing)是Web应用开辟的核心概念。它们共同负责将用户的哀求映射到相应的Python函数,并返回适当的响应。本篇博客将深入探究Django的视图和URLs路由系统,提供实际的代码示例和操作指导,确保读者能够具体而实际地了解如何使用这些功能来构建健壮的Web应用。
  
目录
Django视图与URLs路由详解
一、理解Django视图
1. 创建根本视图
2. 使用通用视图
3. 视图高级用法
二、配置URLs路由
1. 根本路由配置
1.动态路由参数
2. 高级路由技术
1.使用视图类
2.使用视图集
3.嵌套路令
三、进阶:使用装饰器和混入
1. 装饰器
2. 混入
四、安全性和权限
1. 安全性防护
2. 权限控制
五、测试和调试
1. 单位测试和集成测试
2. 调试工具
3. 测试覆盖率
六、总结


Django视图与URLs路由详解


一、理解Django视图

        Django视图是一个Python函数,它吸收一个Web哀求并返回一个Web响应。视图函数处置惩罚从用户那里吸收的数据,与模子交互(如果需要的话),并返回包罗HTML内容的HttpResponse对象或其他类型的响应。
结合菜鸟观看:Django 视图 | 菜鸟教程
1. 创建根本视图

        创建视图的第一步是定义一个函数。这个函数需要吸收几个特定的参数,通常是request对象加上任意数量的HTTP方法(如GET或POST)。
  1. from django.http import HttpResponse
  2. def hello(request):
  3.     return HttpResponse("Hello, World!")
复制代码
        在这个例子中,hello函数就是一个简朴视图。当用户访问与该视图干系联的URL时,他们将看到消息"Hello, World!"。
2. 使用通用视图

        虽然可以手动编写视图来处置惩罚常见的Web哀求,但Django提供了一系列的通用视图,这些视图可以帮助你快速实现尺度的Web功能,例如创建、读取、更新和删除(CRUD)操作。
  1. from django.views.generic import TemplateView
  2. class AboutView(TemplateView):
  3.     template_name = 'about.html'
复制代码
        这里,AboutView类使用TemplateView来出现一个关于页面。你只需指定模板的名称即可。
3. 视图高级用法

        在更复杂的应用中,我们大概需要对视图举行更精致的控制,比如处置惩罚表单数据、文件上传或实现基于用户的权限控制。Django通过中间件和类视图提供了强大的定制本领。
  1. from django.views.generic.edit import CreateView
  2. from .models import CustomModel
  3. class CustomCreateView(CreateView):
  4.     model = CustomModel
  5.     fields = ['field1', 'field2']
复制代码
        在这里,CustomCreateView继续自CreateView,用于处置惩罚特定模子的创建操作。通过指定模子和字段,您可以控制哪些字段是用户可以编辑的。
二、配置URLs路由

        在Django中,URLs路由是通过在应用的urls.py文件中定义一组URL模式来实现的。这些模式决定了哪个视图应该响应哪个URL哀求。让我们更深入地探究如何配置和管理URLs路由,以确保您的应用不仅结构清晰,而且能高效地将哀求引导到正确的视图。
        结合菜鸟观看:Django 路由 | 菜鸟教程 (runoob.com)
1. 根本路由配置

        每个URL模式都映射到一个视图函数上,这可以通过使用path()函数或re_path()(支持正则表达式)来完成。
  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4.     path('hello/', views.hello, name='hello'),
  5. ]
复制代码
        这里定义了一个路径hello/,它将被映射到views.hello视图。通过指定name参数,您可以在模板和其他地方使用这个名称来引用这个URL模式。
1.动态路由参数

        路由也可以接受动态参数,例如:
  1. path('user/<str:username>/', views.profile, name='user_profile'),
复制代码
        在这个例子中,<str:username>是一个字符串类型的动态字段,这个URL将会匹配像/user/johndoe/如许的URL,并将johndoe作为username参数转达给views.profile函数。
2. 高级路由技术

        对于更复杂的应用,可以使用Django的高级路由技术,包括使用视图类、视图集以及嵌套路由等。
1.使用视图类

        视图类为管理URL路由和视图逻辑提供了一种更加结构化的方式。
  1. from django.urls import re_path
  2. from .views import AboutView
  3. urlpatterns = [
  4.     re_path(r'^about/$', AboutView.as_view(), name='about'),
  5. ]
复制代码
        这里,AboutView类的实例化由AboutView.as_view()完成,并通过re_path与URL模式关联。
2.使用视图集

        视图集(ViewSets)提供了一个API的聚集,可以在多个URL中重复使用。
  1. from rest_framework.routers import DefaultRouter
  2. from .views import MyModelViewSet
  3. router = DefaultRouter()
  4. router.register(r'models', MyModelViewSet)
  5. urlpatterns = router.urls
复制代码
        此例中,我们使用了Django REST framework的路由器来主动为我们的MyModelViewSet生成CRUD干系的URL模式。
3.嵌套路令

        Django也支持嵌套路令,这对于建立具有层级结构的URL非常有帮助。假设您正在建立一个博客应用,大概会用到如下的嵌套路令配置:
  1. from django.urls import include, path
  2. from .views import blog_views
  3. urlpatterns = [
  4.     path('blog/', include([
  5.         path('post/', blog_views.post_list, name='post-list'),
  6.         path('post/<int:year>/', blog_views.post_year, name='post-year'),
  7.         path('post/new/', blog_views.post_new, name='post-new'),
  8.         path('post/<int:pk>/edit/', blog_views.post_edit, name='post-edit'),
  9.         path('post/<int:pk>/remove/', blog_views.post_remove, name='post-remove'),
  10.     ])),
  11. ]
复制代码
        在此配置中,全部以/blog/开头的URL都会被include函数捕捉,然后根据后续的URL片段路由到对应的视图。这种方法可以清晰地构造代码,使URLs的结构保持整齐。
        通过经心设计和应用这些路由配置,您可以确保您的Django应用不仅功能强大,而且易于理解和维护。
三、进阶:使用装饰器和混入


        在Django中,装饰器和混入都是用于扩展视图功能的机制。装饰器是一种在不修改函数代码的情况下增强函数功能的方式,通常用于视图函数以添加如权限校验、缓存控制等功能。而混入则通过包罗特定的属性或方法来扩展类的功能,提供了组合继续的替代方法。
1. 装饰器

        装饰器是一种修改函数或类的举动的方法,无需直接更改其代码。在Django中,装饰器常用于为视图添加额外的功能,如查抄用户是否已登录。
  1. from django.contrib.auth.decorators import login_required
  2. @login_required
  3. def profile(request):
  4.     # 逻辑代码...
复制代码
        这里,login_required装饰器确保只有登录的用户才能访问profile视图。
2. 混入

        混入是多重继续的一种形式,答应你组合多个类的举动。在Django中,混入常用于重用视图逻辑。
  1. from django.contrib.auth.mixins import LoginRequiredMixin
  2. from django.views.generic.detail import DetailView
  3. class ProfileView(LoginRequiredMixin, DetailView):
  4.     model = User
  5.     template_name = 'user_detail.html'
复制代码
        在此例中,ProfileView通过继续LoginRequiredMixin和DetailView得到了两种举动:需要用户登录和显示单个对象的详情。
四、安全性和权限


        在Web应用中,包管视图的安全好坏常紧张的。Django提供了一系列的工具和中间件来帮助开辟者实现这一目标。
1. 安全性防护

        Django框架自带了一系列安全措施,包括防止跨站哀求伪造(CSRF)、跨站脚本(XSS)以及其他Web安全威胁的保护。确保每个视图都使用这些措施是至关紧张的。
  1. from django.views.decorators.csrf import csrf_protect
  2. @csrf_protect
  3. def my_view(request):
  4.     # 逻辑代码...
复制代码
        通过使用csrf_protect装饰器,您确保了视图受到CSRF保护。
2. 权限控制

        在许多应用中,某些视图应该只对具有特定权限的用户开放。Django的权限系统可以方便地实现这种需求。
  1. from django.contrib.auth.decorators import permission_required
  2. @permission_required('myapp.change_my_model')
  3. def edit_model(request):
  4.     # 逻辑代码...
复制代码
        使用permission_required装饰器,您限定了只有具有change_my_model权限的用户才能访问edit_model视图。
五、测试和调试


        在开辟过程中,确保您的视图和路由正常工作好坏常紧张的。Django提供了几种工具来帮助您测试和调试代码,包管应用的稳定性和可靠性。
1. 单位测试和集成测试

        测试是确保代码按预期工作的关键。Django的测试框架答应您轻松地编写单位测试和集成测试来验证您的视图。
  1. from django.test import TestCase, Client
  2. from .views import hello
  3. class HelloViewTest(TestCase):
  4.     def test_hello(self):
  5.         client = Client()
  6.         response = client.get('/hello/')
  7.         self.assertEqual(response.status_code, 200)
  8.         self.assertEqual(response.content.decode(), "Hello, World!")
复制代码
        这段代码演示了如何编写一个简朴的测试案例来测试hello视图。使用Django的Client来模拟发送哀求并查抄响应。
2. 调试工具

        当开辟中出现问题时,调试是定位和办理问题的关键步骤。Django内置了一些调试工具,帮助您跟踪问题和错误。
        在DEBUG模式下运行您的应用,可以获取详细的错误信息和栈跟踪,帮助您理解问题的泉源。此外,可以使用像django-extensions包中的RunServerPlus如许的第三方扩展,它提供了一个交互式的调试器,可以直接进入代码中的断点举行调试。
3. 测试覆盖率

        为了确保您的测试覆盖了充足的代码,Django可以与代码覆盖率工具如coverage.py集成。通过测量测试覆盖率,您可以发现哪些部门的代码没有被测试到,从而有针对性地添加更多的测试用例。
  1. coverage run --source='.' manage.py test
  2. coverage report
复制代码
        通过上述命令,您可以运行测试并查看覆盖率报告,确保每个紧张的代码分支都被测试到。
六、总结

        在本系列文章中,我们从多方面详细探究了在Django中设置和使用视图、URL路由以及测试和调试的本事。正确的路由配置对于网站结构的清晰性和用户体验都是至关紧张的。我们也先容了如何通过编写单位测试和集成测试来包管代码质量,以及如何使用Django的调试工具来识别和办理代码中的问题。
        希望这些内容能够帮助您更好地理解和使用Django的强大功能,为您的应用构建一个安全、高效且易于维护的后端系统。无论是正在开辟一个小项目还是大型应用,把握这些根本的技术都是成功开辟的关键。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表