Django路由系统
# 1.正则表达式
r 转义符
^ 以什么开头
$ 以什么结尾
\d 数字
\w 标识符(word)表示大小写字母,数字,下划线
. 表示除了换行符的任意内容
\d{n} 数字n表示该原字符执行次数,且只能匹配这么多次
\d{n,}数字n表示该原字符至少出现n次
\d{n,m}数字n表示该原字符至少出现n次,至多出现m次
\d? ?表示匹配0次或者1次 ,比如小数点
\d+ +表示匹配1次或多次
\d * *表示匹配0次或多次 ,比如匹配整数或者小数
# 2.URLconf配置
from django.conf.urls import url
urlpatterns = [
url(正则表达式, views视图,参数,别名),
]
#在url传参时要以字典形式传参
urlpatterns = [
url(r'^blog$', views.year_archive, {'foo': 'bar'}),
]
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
正则表达式:一个正则表达式字符串
views视图:一个可调用对象,通常为一个视图函数
参数:可选的要传递给视图函数的默认参数(字典形式)
别名:一个可选的name参数
#Django2.0版本路由系统的写法 from django.urls import path,re_path urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail), ]
1
2
3
4
5
6
7
8
9
# 3.分组匹配
每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图,无论正则表达式使用的是什么匹配方式
分组
正则表达式中加一个()表示分组
url(r'^blog/([0-9]{4})/$', views.blogs), #分组:将捕获的参数以元组的形式按位置传参传递给视图函数----捕获的都是字符串
1
命名分组
(?P<名称>正则表达式)
url(r'^blog/(?P<year>[0-9]{4})/$', views.blogs),#命名分组:将捕获的参数按关键字以字典传参传递给视图函数----捕获的都是字符串
1
# 4.include
- 在协同合作开发时,每个人开发的功能不一样,就可以自定义app,运用include,灵活调用
include 包含
首先定义--项目settings同目录下的urls.py中的内容
from django.conf.urls import include, url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app_func1/', include('app_func1.urls')), # 这种写法会指定到app_func文件夹下的urls文件 url(r'^app_func2/', include('app_func2.urls')), ]
1
2
3
4
5
6
7然后再---自定义app_func中的urls.py中的内容
#到app_func中找到urls文件进行匹配 from django.conf.urls import url from . import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^blog/$', views.blog), url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})/$', views.blogs), ]
1
2
3
4
5
6
7
8
9
10
- #首先加载settings同目录下的urls.py中的内容,匹配app_func,然后去匹配include的内容
- #由include中的内容匹配二层地址
- 可以创建多个urls.py文件
# 5.URL的命名和反向解析
通过自定义别名name取到完整的url路径
- 命名的别名只能用在模板和py文件中,不能用在url中
# 5.1静态路由
命名
url(r'^blog/$', views.blog, name='blog_name'),
1反向解析(在模板和py文件中用到反向解析)--通过自定义别名name取到完整的url路径
模板中调用反向解析获取的url路径
{% url'blog_name'%} #获取到blog的完整路径 /blog_name/
1py文件中调用反向解析获取的url路径
from django.urls import reverse reverse('blog_name') #获取到blog的完整路径 '/blog_name/'
1
2
# 5.2动态路由
分组完成动态路由
自定义别名
url(r'^blog/([0-9]{4})/(\d{2})/$', views.blogs, name='blogs'),
1反向解析
在模板中
{% url 'blogs' '2222' '12' %}" ——》 /blog/2222/12/
1py文件中
from django.urls import reverse reverse('blogs',args=('2019','06')) ——》 /app01/blog/2019/06/
1
2
命名分组
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})/$', views.blogs, name='blogs'),
1- 反向解析
模板
#两种方式 {% url 'blogs' '2222' '12' %}" ——》 /blog/2222/12/ {% url 'blogs' year=2222 month=12 %}" ——》 /blog/2222/12/
1
2
3
4
5
- py文件中 ```python #两种方式 from django.urls import reverse reverse('blogs',args=('2019','06')) ——》 /app01/blog/2019/06/ reverse('blogs',kwargs={'year':'2019','month':'06'}) ——》 /app01/blog/2019/06/
1
2
3
4
5
6
7
8
9
10- 反向解析
# 6.命名空间模式namespace
作用:即使不同的APP使用相同的URL名称,URL的命名空间模式也可以反向解析命名的URL。
定义时在setting同目录下的urls.py中写入
urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^app01/', include('app01.urls', namespace='app01')), url(r'^app02/', include('app02.urls', namespace='app02')), ]
1
2
3
4
5调用时在别面馆前面加上namespace 名称
在模板中
{% url 'app01:blogs' 2222 12 %}
1在py文件中
reverse('app01:blogs',args=('2019','06'))
1
上次更新: 2023/04/16, 18:35:33