Django路由系统
1. 基础路由
1.1 单一路由
- url(r'^index$', views.index)
1.2 基于正则路由
- url(r'^index/(\d+)', views.index),
1.3 额外参数路由
- url(r'^index/'), views.index, {'id': 3333}
- # views中
- def index(request, id):
- pass
1.4 示例代码
- from django.conf.urls import url
- from . import views
- urlpatterns = [
- 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),
- ]
- '''
- 请求:
- /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数views.month_archive(request, '2005', '03')。
- /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。
- /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。
- /articles/2003 不匹配任何一个模式,因为每个模式要求URL 以一个反斜线结尾。
- /articles/2003/03/03/ 将匹配最后一个模式。Django 将调用函数views.article_detail(request, '2003', '03', '03')。
- '''
1.5 注意
'^index$'
中^
和$
表示匹配的开始与结尾url(r'^edit/(\w+).html$', views.edit)
伪静态 seo权限会更高- 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号
- 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles
- 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的”(字符串中任何字符都不应该转义)
2. 分组路由
2.1 基于正则的分组路由
命名正则表达式组的语法是(?P
捕获的值作为关键字参数而不是位置参数传递给视图函数
- url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
- '''
- 补充:如果使用分组路由,需全部使用分组路由,否则会出现前后取不到的情况
- '''
- url(r'^test/(?P<fff>\d+)/', views.test, name='t1'),
- url(r'^test/(\d+)/(?P<fff>\d+)/', views.test, name='t1'),
2.2 示例代码
- from django.conf.urls import url
- from . import views
- urlpatterns = [
- url(r'^articles/2003/$', views.special_case_2003),
- url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
- url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
- url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
- ]
- '''
- 请求
- /articles/2005/03/ 请求将调用views.month_archive(request, year='2005', month='03')函数,而不是views.month_archive(request, '2005', '03')。
- /articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。
- '''
3. 路由分发
- '''
- 请求:
- /app01/index.html
- 请求将匹配 urls.py中的'^app01/', 遇到路由分发'include('app01.urls')',
- 请求将匹配 app01.urls.py 中的^index.html$', 调用 index
- '''
3.1 urls.py
- from django.conf.urls import include, url
- urlpatterns = [
- url(r'^app01/', include('app01.urls')),
- ]
3.2 app01.urls.py
- url(r'^index.html$', views.index),
4. 反向解析
4.1 路由关系命名
设置名称后,可以在不同的地方调用
- url(r'^index/(\d*)', views.index1, name='h1'),
- url(r'^index/(?P<hhh>\d*)', views.index2, name='h2'),
4.2 视图函数中反向解析
- from django.urls import reverse
- def index1(request, *args):
- '''
- 路由关系1
- '''
- v = reverse('h1', args = (2012,)) # 注意args 后面加可迭代的元素
- print(v) # index/2012
- return HttpResponse('...')
- def index2(request, *args, **kwargs):
- '''
- 路由关系2
- '''
- v = reverse('h2', kwargs = {'hhh': 2015}) # 注意args 后面加可迭代的元素
- print(v) # index/2015
- return HttpResponse('...')
- '''
- 总结:
- reverse 后不管是args还是kwargs 参数数值可改变
- '''
4.3 模板中反向解析
- <!--路由关系1与2的方式相同-->
- {% url 'h1' 2012 %} # 2012为随意填写数据
- <ul>
- {% for item in data_list %}
- <li><a href="{% url 'h1' item %}">{{ item }} Archive</a></li>
- {% endfor %}
- </ul>
4.4 Model中反向解析
待整理
5. 名称空间
待整理