Django——路由系统
URL配置(URLconf)就像Django所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。
我们就是以这种方式告诉Django,遇到哪个URL的时候,要对应执行哪个函数。
基本格式
from django.conf.urls import url
from . import views
urlpatterns = [
url('home', views.home), #简单路由
url(r'^articles/2003/$', views.special_case_2003), #匹配路由
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
- urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
- 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
- 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
- 每个正则表达式前面的'r' 是可选的但是建议加上。
- Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。
-
增加多层级目录
将很多的URL进行分级处理,分发到其他文件中.
1. 设置setting
在setting.py的INSTALLED_APPS中,添加APP
INSTALLED_APPS = [
'aboutApp',
]
2. 在主URL中,设置一级URL
from django.urls import path,include
urlpatterns = [
path('aboutApp/', include('aboutApp.urls')), #设置主RUL的一级路径
]
3. 设置一级RUL
from aboutApp import views
from django.urls import path,include
urlpatterns = [
path('aboutApp/',views.aboutApp,name='aboutApp')
]
4. 设置views
在一级目录中,创建views,配置python函数。
from django.shortcuts import HttpResponse
def home(request):
html = '<html><body>首页</body></html>'
return HttpResponse(html)
-
命名空间
在使用命名URL解析时,将会有名称冲突的问题发生。
那么就需要使用命名空间namespace,将不同的URL confs文件进行区分
from django.conf.urls import url, include
urlpatterns = [
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),
]
{% url 'app01:detail' pk=12 pp=99 %}
v = reverse('app01:detail', kwargs={'pk':11})
传参:
-
分组&命名
可以使用分组命名匹配的正则表达式组来捕获URL中的值并以关键字参数形式传递给视图
- 传参永远是字符串形式
- 推荐使用命名传参
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), #month是名称,后面是关键字参数
def book(request,month):
pass
-
字典
传递一个Python 字典作为额外的参数传递给视图函数
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]
命名URL与URL反向解析
模板使用:
为了方便更改URL地址后,不影响在HTML中的地址解析。
url(r'^home', views.home, name='home'), # 给我的url匹配模式起名为 home
url(r'^index/(\d*)', views.index, name='index'), # 给我的url匹配模式起名为index
url(r'^index/(?P<year>[0-9]{4})', views.index, name='index'),
{% url 'home' %} #在HTML中引用,会自动匹配home命名的连接地址
{% url 'index' 2023 %} #位置传参形式
{% url 'index' year='2019' %} #关键字传参
-
reverse(命名URL反向解析)
使用reverse模块将配置好的命名URL地址提取
from django.urls import reverse
url(r'^index/(\d*)', views.index, name='index'),
url(r'^index/(?P<year>[0-9]{4})', views.index, name='index'),
def info(request):
reverse("index", args=("2018", )) #位置传参
reverse("index", kwargs={'year':'2020'}) #关键字传参
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)