django框架详解,django路由匹配原则
本文介绍了Django框架中路由的使用,并通过示例代码进行了详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。
简介
简单来说,路由就是根据用户请求的URL链接判断对应的处理程序,并返回处理结果,即URL与Django的视图建立映射关系。
Django路由是在urls.py中配置的,urls.py中的每个配置都对应相应的处理方法。
Django urls.py的不同版本有不同的配置:
1、Django1.1.x 版本
url() 方法:普通路径和常规路径都可以使用,所以需要手动添加常规的第一个限制符号。
从django.conf.urls导入url #需要引入url
urlpatterns=[
url(r^admin/$,管理网站网址),
Url (r index/$ ,views.index),#普通路径
Url (r articles/([0-9] {4})/$ ,views.articles),#常规路径
]
2、Django 2.2.x 之后的版本
路径:用于普通路径。不需要自己手动添加常规的第一个限制符号。已经添加了底层。Re_path:用于常规路径,需要手动添加常规的第一个限制符号。from django.urls导入re_path #需要用re_path引入。
urlpatterns=[
路径( admin/,admin.site.urls),
Path(index/,views.index),#普通路径
re _ path(r articles/([0-9]{ 4 })/$ ,views.articles),#常规路径
]
总结:Django 1.1 . x版中的url与Django 2.2 . x版中的re_path相同
二、正则路径中的分组
1、正则路径中的无名分组
未命名群按位置传输,一一对应。
除了request,视图中其他参数的数量应该与URL中的组数一致。
urls.py
urlpatterns=[
路径( admin/,admin.site.urls),
re_path(^index/([0-9]{4})/$,观点指数),
]
views.py
从django.shortcuts导入HttpResponse
定义索引(请求,年份):
Print(year) #形参表示路径中一个包的内容,按顺序匹配。
返回HttpResponse(菜鸟教程)
2、正则路径中的有名分组
语法:
(?p组名正则表达式)
命名组按关键字传递,不考虑位置顺序。
除了request,视图中其他参数的个数应该和URL中的组数相同,视图中参数的名称应该和URL中的组名相对应。
urls.py
urlpatterns=[
路径( admin/,admin.site.urls),
re_path(^index/(?P[0-9]{4})/(?P[0-9]{2})/$ ,views.index),
]
views.py
从django.shortcuts导入HttpResponse
定义索引(请求,年,月):
Print(year,month) #形参表示路径中一个包的内容,由关键字匹配。
返回HttpResponse(菜鸟教程)
3、路由分发(include)
存在问题:在Django项目中,多个app目录共享一个URL容易造成混乱,后期维护不方便。
ng>解决:使用路由分发(include),让每个app目录都单独拥有自己的 urls。
步骤:
1、在每个 app 目录里都创建一个 urls.py 文件。
2、在项目名称目录下的 urls 文件里,统一将路径分发给各个 app 目录。
from django.contrib import admin
在各自 app 目录下,写自己的 urls.py 文件,进行路径跳转。
app01 目录:
from django.urls import path,re_path
app02 目录:
from django.urls import path,re_path
在各自 app 目录下的 views.py 文件中写各自的视图函数。
三、反向解析
随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。
这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。
反向解析一般用在模板中的超链接及视图中的重定向。
1、普通路径
在 urls.py 中给路由起别名,name="路由别名"。
path("login1/", views.login, name="login")
在 views.py 中,从 django.urls 中引入 reverse,利用reverse("路由别名")反向解析:
return redirect(reverse("login"))
在模板 templates 中的 HTML 文件中,利用{% url "路由别名" %}反向解析。
<form action="{% url login %}" method="post">
2、正则路径(无名分组)
在 urls.py 中给路由起别名,name="路由别名"。
re_path(r"^login/([0-9]{2})/$", views.login, name="login")
在 views.py 中,从 django.urls 中引入 reverse,利用reverse("路由别名",args=(符合正则匹配的参数,))反向解析。
return redirect(reverse("login",args=(10,)))
在模板 templates 中的 HTML 文件中利用{% url "路由别名" 符合正则匹配的参数 %}反向解析。
<form action="{% url login 10 %}" method="post">
3、正则路径(有名分组)
在 urls.py 中给路由起别名,name="路由别名"。
re_path(r"^login/(?P<year>[0-9]{4})/$", views.login, name="login")
在 views.py 中,从 django.urls 中引入 reverse,利用reverse("路由别名",kwargs={"分组名":符合正则匹配的参数})反向解析。
return redirect(reverse("login",kwargs={"year":3333}))
在模板 templates 中的 HTML 文件中,利用{% url "路由别名" 分组名=符合正则匹配的参数 %}反向解析。
<form action="{% url login year=3333 %}" method="post">
四、命名空间
命名空间(英语:Namespace)是表示标识符的可见范围。
一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。
一个新的命名空间中可定义任何标识符,它们不会与任何重复的标识符发生冲突,因为重复的定义都处于其它命名空间中。
存在问题:路由别名 name 没有作用域,Django 在反向解析 URL 时,会在项目全局顺序搜索,当查找到第一个路由别名 name 指定 URL 时,立即返回。当在不同的 app 目录下的urls 中定义相同的路由别名 name 时,可能会导致 URL 反向解析错误。
解决:使用命名空间。
普通路径
定义命名空间(include 里面是一个元组)格式如下:
include(("app名称:urls","app名称"))
实例:
path("app01/", include(("app01.urls","app01")))
在 app01/urls.py 中起相同的路由别名。
path("login/", views.login, name="login")
在 views.py 中使用名称空间,语法格式如下:
reverse("app名称:路由别名")
实例:
return redirect(reverse("app01:login")
在 templates 模板的 HTML 文件中使用名称空间,语法格式如下:
{% url "app名称:路由别名" %}
实例:
<form action="{% url app01:login %}" method="post">
到此这篇关于Django框架之路由用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。