首页 > 其他分享 >Django视图与URLs路由详解

Django视图与URLs路由详解

时间:2024-07-23 13:25:28浏览次数:14  
标签:views URL 视图 Django URLs import 路由

        在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)。

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello, World!")

        在这个例子中,hello函数就是一个简单视图。当用户访问与该视图相关联的URL时,他们将看到消息"Hello, World!"。

2. 使用通用视图

        虽然可以手动编写视图来处理常见的Web请求,但Django提供了一系列的通用视图,这些视图可以帮助你快速实现标准的Web功能,例如创建、读取、更新和删除(CRUD)操作。

from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = 'about.html'

        这里,AboutView类使用TemplateView来呈现一个关于页面。你只需指定模板的名称即可。

3. 视图高级用法

        在更复杂的应用中,我们可能需要对视图进行更精细的控制,比如处理表单数据、文件上传或实现基于用户的权限控制。Django通过中间件和类视图提供了强大的定制能力。

from django.views.generic.edit import CreateView
from .models import CustomModel

class CustomCreateView(CreateView):
    model = CustomModel
    fields = ['field1', 'field2']

        在这里,CustomCreateView继承自CreateView,用于处理特定模型的创建操作。通过指定模型和字段,您可以控制哪些字段是用户可以编辑的。

二、配置URLs路由

        在Django中,URLs路由是通过在应用的urls.py文件中定义一组URL模式来实现的。这些模式决定了哪个视图应该响应哪个URL请求。让我们更深入地探讨如何配置和管理URLs路由,以确保您的应用不仅结构清晰,而且能高效地将请求引导到正确的视图。

        结合菜鸟观看:Django 路由 | 菜鸟教程 (runoob.com)

1. 基本路由配置

        每个URL模式都映射到一个视图函数上,这可以通过使用path()函数或re_path()(支持正则表达式)来完成。

from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.hello, name='hello'),
]

        这里定义了一个路径hello/,它将被映射到views.hello视图。通过指定name参数,您可以在模板和其他地方使用这个名称来引用这个URL模式。

1.动态路由参数

        路由也可以接受动态参数,例如:

path('user/<str:username>/', views.profile, name='user_profile'),

        在这个例子中,<str:username>是一个字符串类型的动态字段,这个URL将会匹配像/user/johndoe/这样的URL,并将johndoe作为username参数传递给views.profile函数。

2. 高级路由技术

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

1.使用视图类

        视图类为管理URL路由和视图逻辑提供了一种更加结构化的方式。

from django.urls import re_path
from .views import AboutView

urlpatterns = [
    re_path(r'^about/$', AboutView.as_view(), name='about'),
]

        这里,AboutView类的实例化由AboutView.as_view()完成,并通过re_path与URL模式关联。

2.使用视图集

        视图集(ViewSets)提供了一个API的集合,可以在多个URL中重复使用。

from rest_framework.routers import DefaultRouter
from .views import MyModelViewSet

router = DefaultRouter()
router.register(r'models', MyModelViewSet)

urlpatterns = router.urls

        此例中,我们使用了Django REST framework的路由器来自动为我们的MyModelViewSet生成CRUD相关的URL模式。

3.嵌套路令

        Django也支持嵌套路令,这对于建立具有层级结构的URL非常有帮助。假设您正在建立一个博客应用,可能会用到如下的嵌套路令配置:

from django.urls import include, path
from .views import blog_views

urlpatterns = [
    path('blog/', include([
        path('post/', blog_views.post_list, name='post-list'),
        path('post/<int:year>/', blog_views.post_year, name='post-year'),
        path('post/new/', blog_views.post_new, name='post-new'),
        path('post/<int:pk>/edit/', blog_views.post_edit, name='post-edit'),
        path('post/<int:pk>/remove/', blog_views.post_remove, name='post-remove'),
    ])),
]

        在此配置中,所有以/blog/开头的URL都会被include函数捕获,然后根据后续的URL片段路由到对应的视图。这种方法可以清晰地组织代码,使URLs的结构保持整洁。

        通过精心设计和应用这些路由配置,您可以确保您的Django应用不仅功能强大,而且易于理解和维护。

三、进阶:使用装饰器和混入

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

1. 装饰器

        装饰器是一种修改函数或类的行为的方法,无需直接更改其代码。在Django中,装饰器常用于为视图添加额外的功能,如检查用户是否已登录。

from django.contrib.auth.decorators import login_required

@login_required
def profile(request):
    # 逻辑代码...

        这里,login_required装饰器确保只有登录的用户才能访问profile视图。

2. 混入

        混入是多重继承的一种形式,允许你组合多个类的行为。在Django中,混入常用于重用视图逻辑。

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.detail import DetailView

class ProfileView(LoginRequiredMixin, DetailView):
    model = User
    template_name = 'user_detail.html'

        在此例中,ProfileView通过继承LoginRequiredMixinDetailView获得了两种行为:需要用户登录和显示单个对象的详情。

四、安全性和权限

        在Web应用中,保证视图的安全是非常重要的。Django提供了一系列的工具和中间件来帮助开发者实现这一目标。

1. 安全性防护

        Django框架自带了一系列安全措施,包括防止跨站请求伪造(CSRF)、跨站脚本(XSS)以及其他Web安全威胁的保护。确保每个视图都使用这些措施是至关重要的。

from django.views.decorators.csrf import csrf_protect

@csrf_protect
def my_view(request):
    # 逻辑代码...

        通过使用csrf_protect装饰器,您确保了视图受到CSRF保护。

2. 权限控制

        在许多应用中,某些视图应该只对具有特定权限的用户开放。Django的权限系统可以方便地实现这种需求。

from django.contrib.auth.decorators import permission_required

@permission_required('myapp.change_my_model')
def edit_model(request):
    # 逻辑代码...

        使用permission_required装饰器,您限制了只有具有change_my_model权限的用户才能访问edit_model视图。

五、测试和调试

        在开发过程中,确保您的视图和路由正常工作是非常重要的。Django提供了几种工具来帮助您测试和调试代码,保证应用的稳定性和可靠性。

1. 单元测试和集成测试

        测试是确保代码按预期工作的关键。Django的测试框架允许您轻松地编写单元测试和集成测试来验证您的视图。

from django.test import TestCase, Client
from .views import hello

class HelloViewTest(TestCase):
    def test_hello(self):
        client = Client()
        response = client.get('/hello/')
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.content.decode(), "Hello, World!")

        这段代码演示了如何编写一个简单的测试案例来测试hello视图。使用Django的Client来模拟发送请求并检查响应。

2. 调试工具

        当开发中出现问题时,调试是定位和解决问题的关键步骤。Django内置了一些调试工具,帮助您跟踪问题和错误。

        在DEBUG模式下运行您的应用,可以获取详细的错误信息和栈跟踪,帮助您理解问题的来源。此外,可以使用像django-extensions包中的RunServerPlus这样的第三方扩展,它提供了一个交互式的调试器,可以直接进入代码中的断点进行调试。

3. 测试覆盖率

        为了确保您的测试覆盖了足够的代码,Django可以与代码覆盖率工具如coverage.py集成。通过测量测试覆盖率,您可以发现哪些部分的代码没有被测试到,从而有针对性地添加更多的测试用例。

coverage run --source='.' manage.py test
coverage report

        通过上述命令,您可以运行测试并查看覆盖率报告,确保每个重要的代码分支都被测试到。

六、总结

        在本系列文章中,我们从多方面详细探讨了在Django中设置和使用视图、URL路由以及测试和调试的技巧。正确的路由配置对于网站结构的清晰性和用户体验都是至关重要的。我们也介绍了如何通过编写单元测试和集成测试来保证代码质量,以及如何使用Django的调试工具来识别和解决代码中的问题。

        希望这些内容能够帮助您更好地理解和利用Django的强大功能,为您的应用构建一个安全、高效且易于维护的后端系统。无论是正在开发一个小项目还是大型应用,掌握这些基本的技术都是成功开发的关键。

标签:views,URL,视图,Django,URLs,import,路由
From: https://blog.csdn.net/jkoij23/article/details/140633125

相关文章

  • django学习入门系列之第四点《案例 走马灯(让字幕滚动)》
    文章目录往期回顾<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><spanid="txt">欢迎中国联通领导过来指导</span><scri......
  • Python 协议和 Django 模型
    假设我有一个简单的协议A和一个未能实现该协议的类B:fromtypingimportProtocolclassA(Protocol):deffoo(self)->str:...classB:pass当下面的代码进行类型检查时,Mypy将正确地抱怨x:A=B()mypy.error:Incompatibletypes......
  • Django 在模型方法中预取
    所以我有一个Django模型,它是其他几个模型的外键。我想向我的模型添加一个方法,并查看我的模型实例是否确实具有任何相关对象。两个问题:我想通过一个查询来完成此操作,但我不确定如何将prefetch_lated与“self”一起使用。我该怎么做?如果存在相关模型,有没有办法只......
  • 12 B端产品常用视图
    原型图        是产品经理最熟悉,也是最常用的,是产品表现层面的Demo,描绘产品的界面长什么样,功能如何设计、摆放,有哪些内容。结构图        展示产品的基本结构、框架,它能清晰展示产品有哪些模块、功能或系统组成。用例图        站在用户的叫做......
  • Django 入门指南:从环境设置到创建第一个应用程序
    简介Django是一个流行的PythonWeb框架,用于快速开发强大的Web应用程序。本指南将带你从安装Django开始,逐步学习如何创建一个简单的Django项目和应用程序。步骤1:准备环境首先,确保你的开发环境中安装了Python,并了解如何使用虚拟环境来管理项目依赖。安装虚拟......
  • django相关面试题
    1.auto_add与auto_add_now作用于时间类型的字段,auto_add_now只在创建数据的时候生效,auto_now在修改数据的时候生效create_time=models.DateTimeField(auto_now_add=True)update_time=models.DateTimeField(auto_now=True)注意这两个属性只有在使用django的orm的create......
  • django.db.utils.OperationalError:无法翻译主机名“postgres.railway.internal”
    django.db.utils.OperationalError:无法将主机名“postgres.railway.internal”翻译为地址:提供的节点名或服务名,或未知我的django项目运行良好,直到将setting.py文件更改为使用铁路提供的变量将其部署在铁路中。从那时起我无法运行serv或迁移,我收到此错误...这里是数据......
  • 为什么将小部件添加到滚动视图在 python kivy 中不起作用
    Python文件fromkivymd.appimportMDAppfromkivy.langimportBuilderfromkivy.uix.floatlayoutimportFloatLayoutfromkivy.core.windowimportWindowfromkivy.configimportConfigfromkivymd.uix.listimportOneLineListItem#UkuranwindowConfig.set(&......
  • 为什么 celery 击败调度程序在 django celery 过期后仍在运行
    PeriodicTask.objects.create(interval=interval,crontab=crontab,clocked=clocked,name=data["name"],task=data["task"],#dropdown......
  • Python (Django) 数据操作
    “如何将Excel考勤数据转换为特定的数据库插入格式?”**我Excel中的数据如下所示:**这是数据格式I**需要将其转换为适合数据库插入的格式,如下所示:**我想要的数据将Excel考勤数据转换为特定数据库插入格式的Python......