Django学习——路由

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: Django学习——路由

学习视频

https://www.bilibili.com/video/BV1KJ41117HL?p=6&vd_source=64a9ed1353ef3dd2486b4ea4d575f7d6


文本学习网站

https://www.runoob.com/django/django-routers.html



Django 路由


路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序,并返回处理结果,也就是 URL 与 Django 的视图建立映射关系。


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), # 正则路径
]


Django 2.2.x 之后的版本


  • path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。
  • 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), # 正则路径
]


总结:Django1.1.x 版本中的 url 和 Django 2.2.x 版本中的 re_path 用法相同。


正则路径中的分组


正则路径中的无名分组


无名分组按位置传参,一一对应。

views 中除了 request,其他形参的数量要与 urls 中的分组数量一致。


urls.py


urlpatterns = [
    path('admin/', admin.site.urls),
    re_path("^index/([0-9]{4})/$", views.index),
]


views.py


from django.shortcuts import HttpResponse
def index(request,year):
    print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配
    return HttpResponse('菜鸟教程')



f3cf033afae900d1054b660991a12a8f_8f2a364150b02e4b25abc6ccc90deaae.png

正则路径中的有名分组

语法:

(?P<组名>正则表达式)


有名分组按关键字传参,与位置顺序无关。

views 中除了 request,其他形参的数量要与 urls 中的分组数量一致, 并且 views 中的形参名称要与 urls 中的组名对应。


urls.py


urlpatterns = [
    path('admin/', admin.site.urls),
    re_path("^index/(?P[0-9]{4})/(?P[0-9]{2})/$", views.index),
]


views.py


from django.shortcuts import HttpResponse
def index(request, year, month):
    print(year,month) # 一个形参代表路径中一个分组的内容,按关键字对应匹配
    return HttpResponse('菜鸟教程')

d2845db5103105c4412da0920ab1af0e_116c6047f4fd3ef89e28204c73a1b2df.png


正则路径中的有名分组


路由分发(include)


存在问题:Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便。

解决:使用路由分发(include),让每个app目录都单独拥有自己的 urls。

步骤:

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


实例


from django.contrib import admin
from django.urls import path,include # 从 django.urls 引入 include
urlpatterns = [
    path('admin/', admin.site.urls),
    path("app01/", include("app01.urls")),
    path("app02/", include("app02.urls")),
]

053a9fc1717ddd70009985fe8e71578c_a3eaded8e72407b98a888158584c6ae6.png

在各自 app 目录下,写自己的 urls.py 文件,进行路径跳转。

app01 目录:

from django.urls import path,re_path 
from app01 import views # 从自己的 app 目录引入 views 
urlpatterns = [ 
    re_path(r'^login/(?P<m>[0-9]{2})/$', views.index, ),
] 

app02 目录:

from django.urls import path,re_path
from app02 import views # 从自己的 app 目录引入views 
urlpatterns = [ 
    re_path("^xxx/(?P[0-9]{4})/$", views.xxx), 
]

e4e5f5e8843e9fc7a0d92ff31f25d387_e36f9464a9f662429a08b5b43ef90d65.png

f1c74f85f231a245849fe8695c35b76e_61d6b9a132641492dcc6d7b8d9a5e438.png

在各自 app 目录下的 views.py 文件中写各自的视图函数。


反向解析


随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。


这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。


反向解析一般用在模板中的超链接及视图中的重定向。


普通路径


在 urls.py 中给路由起别名,name="路由别名"

path("login1/", views.login, name="login")

4cdecc9ad713b7f1a71e7e3e9b13ff36_e30c6c2a97bde11c32f4997a49a6b433.png

在 views.py 中,从 django.urls 中引入 reverse,利用 reverse("路由别名") 反向解析:

return redirect(reverse("login"))

64ed634e6bad214c8441a9db35281309_30ba51603bc1397a732e7c811441b404.png

在模板 templates 中的 HTML 文件中,利用 {% url "路由别名" %} 反向解析。

<form action="{% url 'login' %}" method="post">


9b15b2621cf49793b7d45402597a2063_a22a52a2ebc5f61c5019e21302acd350.png


正则路径(无名分组)


在 urls.py 中给路由起别名,name="路由别名"

re_path(r"^login/([0-9]{2})/$", views.login, name="login")

277c8c1989b9f78b695e91d6f43d0700_f01cd05ae8660b7c5766f7b1f61c8dfa.png

在 views.py 中,从 django.urls 中引入 reverse,利用 reverse("路由别名",args=(符合正则匹配的参数,)) 反向解析。

return redirect(reverse("login",args=(10,)))

d9bfce69343182525cf749c3ccc5e8a4_9dd2dac744eef090a2395955829db180.png

在模板 templates 中的 HTML 文件中利用 {% url "路由别名" 符合正则匹配的参数 %} 反向解析。

<form action="{% url 'login' 10 %}" method="post">

cfc18da84e77b7b9f572c67ae9f7864d_ea83fed760d7b57ac1e7f463b3356e9d.png


正则路径(有名分组)


在 urls.py 中给路由起别名,name="路由别名"

re_path(r"^login/(?P<year>[0-9]{4})/$", views.login, name="login")

685c1932bfcd6973b15fe8f9c5a262bd_c2686d9f3e75a68b1d2a0a865866fa5d.png在 views.py 中,从 django.urls 中引入 reverse,利用 reverse("路由别名",kwargs={"分组名":符合正则匹配的参数}) 反向解析。

return redirect(reverse("login",kwargs={"year":3333}))

0d0090124f0b468f53e9c2034cfdac36_878bd2f36c6127c8d7b3453d66184f67.png


在模板 templates 中的 HTML 文件中,利用 {% url "路由别名" 分组名=符合正则匹配的参数 %} 反向解析。

<form action="{% url 'login' year=3333 %}" method="post">

624866dcf8bdd5d745b4deecf6a49d9a_a7dd5a26f4030fb7762ec3ebf1c6e0a7.png


命名空间


命名空间(英语:Namespace)是表示标识符的可见范围。


一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。


一个新的命名空间中可定义任何标识符,它们不会与任何重复的标识符发生冲突,因为重复的定义都处于其它命名空间中。


存在问题:路由别名 name 没有作用域,Django 在反向解析 URL 时,会在项目全局顺序搜索,当查找到第一个路由别名 name 指定 URL 时,立即返回。当在不同的 app 目录下的urls 中定义相同的路由别名 name 时,可能会导致 URL 反向解析错误。


解决:使用命名空间。


普通路径


定义命名空间(include 里面是一个元组)格式如下:

include(("app名称:urls","app名称"))


实例:

1. path("app01/", include(("app01.urls","app01"))) 
2. path("app02/", include(("app02.urls","app02")))

a918bffae3143d5d19aec8aee2040471_9626f830857fcb466bcd2f7d373e6ebb.png

在 app01/urls.py 中起相同的路由别名。

path("login/", views.login, name="login")


aa4936b953aa7392f27f9227bf22c6c7_2f6d7ad3009e84c9ae18443ae26fb8fb.png

在 views.py 中使用名称空间,语法格式如下:

reverse("app名称:路由别名")

实例:

return redirect(reverse("app01:login")

926cac2e207aadd63572ea9ae357ccc5_27e0152a73ba1cfd31e8770237f9343a.png


在 templates 模板的 HTML 文件中使用名称空间,语法格式如下:

{% url "app名称:路由别名" %}

实例:

<form action="{% url 'app01:login' %}" method="post">

492741e9918727649d4f073497081f65_472758f9f7eb2a444a9ecce49b6906ba.png



目录
相关文章
|
Python
django路由传参可默认为空
django路由传参可默认为空
76 0
|
存储 缓存 数据库
Django框架学习(四)
Django框架学习(四)
|
前端开发 关系型数据库 MySQL
Django框架学习(三)
Django框架学习(三)
|
4月前
|
编解码 前端开发 JavaScript
技术经验分享:Django学习日记
技术经验分享:Django学习日记
|
2月前
|
Python SEO
Django入门到放弃之路由
Django入门到放弃之路由
|
2月前
|
Python
[django]路由变量与正则表达式
[django]路由变量与正则表达式
|
4月前
|
JSON API 网络架构
Django REST framework视图集与路由详解:深入理解ViewSet、ModelViewSet与路由映射器
Django REST framework视图集与路由详解:深入理解ViewSet、ModelViewSet与路由映射器
|
4月前
|
存储 安全 网络协议
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘
|
4月前
|
API 网络架构 Python
在django使用视图集和路由集
【6月更文挑战第11天】本文介绍Viewsets是Django REST框架中将多个视图逻辑整合到单个类的工具,减少了重复代码。当项目API变得复杂且有重复模式时,考虑使用它们;否则,保持视图和URL模式的简洁性。
35 3
|
4月前
|
API 数据库 网络架构
在django中应用视图和路由集
【6月更文挑战第10天】 本文介绍viewsets`和`Routers`是Django REST framework中用于简化API视图和路由的工具。它们提供了一个抽象层,允许用更少的代码替代多个相关视图,并能自动生成URL。定义`UserList`和`UserDetail`视图集,分别用于列表和详情展示。
24 3