Django(6)路由(一)

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: Django(6)路由(一)
>>> django.VERSION  
(4, 1, 0, 'final', 0)

PS:基于前几章的进度进行修改


一、路由概述


路由简单的说就是根据用户请求的URL连接来判断对应的处理程序,并且返回处理结果


路由主要用于建立URL与Django视图之间的映射关系。路由在urls.py文件配置,urls.py文件中每一条配置都对应了处理程序


不同版本的Django,urls.py文件的配置也有点差异


Django1.1.X版本:


url():普通路径和正则路径都可以使用,需要自己手动添加正则首位限制符号,例如

from django.conf.urls import url # 用 url 需要引入
urlpatterns = [
    url(r'^admin/$', admin.site.urls),
    url(r'^index/$', views.index), # 普通路径
    url(r'^articles/([0-9]{4})/$', views.articles), # 正则路径
]
  • Django2.2.X之后的版本:


path():代替1.1版本的url()方法,不需要手动添加正则首位限制符号,底层已经添加

re_path():用于正则路径,需要自己手动添加正则首位限制符号


from django.urls import re_path # 用re_path 需要引入
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index), # 普通路径
    re_path(r'^articles/([0-9]{4})/$', views.articles), # 正则路径
]


二、正则路径中的分组


(1)正则路径中的无名分组


  • 无名分组按照位置传参,根据顺序一一对应
  • views中除了request参数,其他形参的数量要与urls中的分组数量一致,否则会报错


- 修改urls.py文件
#-*- coding: utf-8 -*-
from django.urls import re_path
from . import views
urlpatterns = [
    re_path("^test/([0-9]{4})/$",views.test),  #匹配以test开头,/结尾,例如/test/1234/
]
- 修改views.py文件
# -*- coding: utf-8 -*-
from django.http import HttpResponse
def test(request,year):
    print(year)
    return HttpResponse("Test")

访问127.0.0.1:8000/test/2022,观察终端输出,最终print输出的是2022,这是因为方法的一个形参,代表路径中一个分组的内容,按顺序进行匹配,year参数匹配的是第二个分组([0-9]{4}),所以最终输出2022

d08c211dd7e54ad896dc920c8cafbff1.png


74d212d816e045acb7f1179218de83bb.png



(2)正则路径中的有名分组


  • 语法:


(?P<组名>正则表达式)  #大写的P


  • 有名分组按照关键字传参,与位置顺序没有关系
  • views中除了request参数,其他形参的数量要与urls中的分组数量一致,并且views中的形参名称要与urls中的组名相对应
- 修改urls.py文件
#-*- coding: utf-8 -*-
from django.urls import re_path
from . import views
urlpatterns = [
    re_path("^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$",views.test),
]
#分别指定year参数与month参数
- 修改views.py文件
# -*- coding: utf-8 -*-
from django.http import HttpResponse
def test(request,year,month):
    print(year,month)
    return HttpResponse("Test")
  • 访问127.0.0.1:8000/test/2022/08,查看终端输出



909e0b3ab26c43118d452c6adc762831.png4c707c76cc704f5d8c64636e54fc7718.png


注意:无名分组和有名分组不能混用!!


(3)路由分发


  • Django项目中多个app目录共用一个urls非常容易混淆,后期维护也不方便,可以使用路由分发,让每个app目录都单独拥有自己的urls,实际步骤为:


  1. 在每个app目录中都创建一个urls.py文件
  2. 在项目名称目录下的urls.py文件中,统一将路径分发给各app目录


  • 创建app目录,在项目目录下创建test1test2

13cfc48259cc4bd0a3a359fe25883b27.png


  • 分别在两个目录下创建文件urls.pyviews.py文件

217bd9179cb54265a81ab3d8259c9d02.png


  • 先修改helloworld主app目录下的urls.py文件
#-*- coding: utf-8 -*-
from django.urls import re_path,path,include
from . import views
urlpatterns = [
    path('Year/',include("test1.urls")),   #分发给两个app目录下的urls.py文件
    path('Month/',include("test2.urls")),
]
  • 修改两个usrl.py文件
- test1/urls.py
#-*- coding: utf-8 -*-
from django.urls import re_path
from . import views
urlpatterns = [
    re_path('test1/(?P<year>[0-9]{4})/$',views.test1),
]
- test2/urls.py
#-*- coding: utf-8 -*-
from django.urls import re_path
from . import views
urlpatterns = [
    re_path('test2/(?P<month>[0-9]{2})/$',views.test2),
]


  • 修改两个views.py文件
- test1/views.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
def test1(request,year):
    print(year)
    return HttpResponse("Test1")
- test2/views.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse
def test2(request,month):
    print(month)
    return HttpResponse("Test2")
  • 访问测试test1,需要访问127.0.0.1:8000/Year/test1/2022/,观察终端输出


注意:访问的资源路径是主app的urls路径加分发的app的urls路径,所以最终是/Year/test1/2022


889b9128722b45d4867f920083759080.pnge4e3ffceabbe4f0fabcc5eba36c36705.png



访问测试test2,同理访问127.0.0.1:8000/Month/test2/08/,观察终端输出


6214fbc697814afaa73ed61928d8b758.png

a800505f3cc0411fa2fd38f155d04749.png



三、反向解析(使用reverse)


随着功能的增加、路由层url的变化,通常需要去修改对应的视图层和模板层的url,每次一变化就去修改,不便于维护

上述情况可以使用反向解析,当路由层url发生变化时,只需在视图层和模板层动态反向解析出更改后的url,这样就免去了修改的操作

反向解析一般作用于模板中的超链接以及视图中的重定向


(1)普通路径


  • 在urls.py文件中给路由起“别名”,语法为:name="别名",实例:
- 修改urls.py文件
#-*- coding: utf-8 -*-
from django.urls import path
from . import views
urlpatterns = [
    path('index/',views.index),
    path('login/',views.login,name="login"),  #别名login
]
- 在views.py文件中,从urls引入reverse,利用reverse("别名")进行反向解析
# -*- coding: utf-8 -*-
from django.urls import reverse
from django.http import HttpResponse
from django.shortcuts import redirect,render
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def index(request):
    if request.method == "GET":
        return HttpResponse("请使用POST")
    else:
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        if username == 'zhangsan' and pwd == '123456':
            return HttpResponse("登录成功!!")
        else:
            return redirect(reverse('login')) #反向解析
def login(request):
        return HttpResponse('请传入 username 和 pwd 参数')


  • 直接访问127.0.0.1:8000/index

92068ca51c0441b3af2595abb881439b.png

使用postman不加参数进行访问127.0.0.1:8000/index/,查看终端输出,可以看到302跳转,并且跳转是通过GET方式访问的login资源


b91592a46adc49688840cfb49751f073.png

4afce15f1760403c809848d5b34970e5.png


使用postman访问,添加username和pwd参数


0054303ebd3a49c6b9e335a59949ff27.png


不使用正确参数


80548dd209ff4db184fab199667b2f3c.png

目录
相关文章
|
Python
django路由传参可默认为空
django路由传参可默认为空
94 0
|
1月前
|
Python
Django 框架的路由系统
Django 框架的路由系统
44 6
|
4月前
|
Python SEO
Django入门到放弃之路由
Django入门到放弃之路由
|
4月前
|
Python
[django]路由变量与正则表达式
[django]路由变量与正则表达式
|
6月前
|
JSON API 网络架构
Django REST framework视图集与路由详解:深入理解ViewSet、ModelViewSet与路由映射器
Django REST framework视图集与路由详解:深入理解ViewSet、ModelViewSet与路由映射器
|
6月前
|
存储 安全 网络协议
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
|
6月前
|
API 网络架构 Python
在django使用视图集和路由集
【6月更文挑战第11天】本文介绍Viewsets是Django REST框架中将多个视图逻辑整合到单个类的工具,减少了重复代码。当项目API变得复杂且有重复模式时,考虑使用它们;否则,保持视图和URL模式的简洁性。
47 3
|
6月前
|
API 数据库 网络架构
在django中应用视图和路由集
【6月更文挑战第10天】 本文介绍viewsets`和`Routers`是Django REST framework中用于简化API视图和路由的工具。它们提供了一个抽象层,允许用更少的代码替代多个相关视图,并能自动生成URL。定义`UserList`和`UserDetail`视图集,分别用于列表和详情展示。
29 3
|
6月前
|
缓存 JSON API
在django项目中使用装饰器管理路由
【6月更文挑战第12天】本文介绍了Python装饰器在API管理中的应用,包括用于延迟计算、缓存和转换函数的装饰器。实践中,以Django Rest Framework为例,演示了如何使用装饰器定义GET、POST、PUT和DELETE请求的视
67 1
|
前端开发 网络架构 Python
django实现动态路由的简单方法
django实现动态路由的简单方法
140 1