五、Django之路由系统
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/9311321.html
目录
1、普通路由匹配
2、命名路由匹配
3、二级路由(Including)
4、传递额外的参数到视图函数
5、带别名的url
1、普通路由匹配
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;它就是以这种方式告诉Django,用哪个URL调用哪段代码。URL的加载是从配置文件中开始。
1 2 3 | urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] |
参数说明:
- 一个正则表达式字符串
- 一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 可选的要传递给视图函数的默认参数(字典形式)
- 一个可选的name参数
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from django.conf.urls import url from . import views urlpatterns = [ #匹配articles开头,2003结尾的url,精确匹配。 url(r '^articles/2003/$' , views.special_case_2003), #articles开头,4个数字结尾的url,模糊匹配 url(r '^articles/([0-9]{4})/$' , views.year_archive), #articles开头,再接4位数字,最后接2位数字结尾的url url(r '^articles/([0-9]{4})/([0-9]{2})/$' , views.month_archive), #articles开头,再接4位数字,再接2位数字,最后接数字,至少1个数字 url(r '^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$' , views.article_detail), ] |
2、命名路由匹配
通过正则表达式进行匹配url。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from django.conf.urls import url from . import views urlpatterns = [ #匹配articles开头,2003结尾的url url(r '^articles/2003/$' , views.special_case_2003), #匹配articles开头,视图函数包含4位数字的year参数 url(r '^articles/(?P<year>[0-9]{4})/$' , views.year_archive), #匹配articles开头,视图函数包含4位数字的year参数,2位数字的month参数 url(r '^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$' , views.month_archive), #匹配articles开头,包含4位数字的year,2位数字的month,2位数字的day url(r '^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$' , views.article_detail), ] |
3、二级路由(Including)
如果映射 url 太多怎么办,全写一个在 urlpatterns 显得繁琐,所以二级路由应用而生。所以include主要是用于减少重复代码。
此外,还有一个应用场景,就是在多个app里面,使用include将url分开,这样就不会显得url有很多,且看上去简洁明了。
例子1:
作用:简单明了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from django.conf.urls import include, url from apps.main import views as main_views from credit import views as credit_views extra_patterns = [ url(r '^reports/$' , credit_views.report), url(r '^reports/(?P<id>[0-9]+)/$' , credit_views.report), url(r '^charge/$' , credit_views.charge), ] urlpatterns = [ url(r '^$' , main_views.homepage), url(r '^help/' , include( 'apps.help.urls' )), url(r '^credit/' , include(extra_patterns)), ] |
例子2:
作用:减少重复代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # include前版本 from django.conf.urls import url from . import views urlpatterns = [ url(r '^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/history/$' , views.history), url(r '^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/edit/$' , views.edit), url(r '^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/discuss/$' , views.discuss), url(r '^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/permissions/$' , views.permissions), ] # include后版本 from django.conf.urls import include, url from . import views urlpatterns = [ url(r '^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/' , include([ url(r '^history/$' , views.history), url(r '^edit/$' , views.edit), url(r '^discuss/$' , views.discuss), url(r '^permissions/$' , views.permissions), ])), ] |
例子3:多app分散url
作用:url分配到对应的app,简洁明了。
1 2 3 4 | urlpatterns = [ url(r '^admin/' , admin.site.urls), url(r '^blog/' , include( 'blog.urls' )), #一个为blog的app的url单独为一个文件 ] |
4、传递额外的参数到视图函数
作用:对于某一批URL具有固定参数的时候就可以使用此方法。
1 2 3 4 5 | urlpatterns = [ url(r '^blog/(?P<year>[0-9]{4})/$' , views.year_archive, { 'foo' : 'bar' }), ] #视图函数里面调用 views.year_archive(request, year = '2005' ,foo = 'bar' ) |
5、带别名的url
作用:对于url很长的时候比较有用。
1 2 3 4 5 6 7 8 9 10 11 12 13 | urlpatterns = [ url(r '^index' ,views.index,name = 'myindex' ), ] #调用别名 <body> { #<form action="/index/" method="post">#} <form action = "{% url 'myindex' %}" method = "post" > 用户名:< input type = "text" name = "username" > 密码:< input type = "password" name = "password" > < input type = "submit" value = "submit" > < / form> < / body> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」