Django路由系统

1. 基础路由

1.1 单一路由
  1. url(r'^index$', views.index) 
1.2 基于正则路由
  1. url(r'^index/(\d+)', views.index), 
1.3 额外参数路由
  1. url(r'^index/'), views.index, {'id': 3333
  2.  
  3. # views中 
  4. def index(request, id): 
  5. pass 
1.4 示例代码
  1. from django.conf.urls import url 
  2. from . import views 
  3.  
  4. urlpatterns = [ 
  5. url(r'^articles/2003/$', views.special_case_2003), 
  6. url(r'^articles/([0-9]{4})/$', views.year_archive), 
  7. url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), 
  8. url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), 
  9. ''' 
  10. 请求: 
  11. /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数views.month_archive(request, '2005', '03')。 
  12. /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。 
  13. /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。 
  14. /articles/2003 不匹配任何一个模式,因为每个模式要求URL 以一个反斜线结尾。 
  15. /articles/2003/03/03/ 将匹配最后一个模式。Django 将调用函数views.article_detail(request, '2003', '03', '03')。 
  16. ''' 
1.5 注意
  • '^index$'^$表示匹配的开始与结尾
  • url(r'^edit/(\w+).html$', views.edit) 伪静态 seo权限会更高
  • 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号
  • 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles
  • 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的”(字符串中任何字符都不应该转义)

2. 分组路由

2.1 基于正则的分组路由

命名正则表达式组的语法是(?Ppattern),其中name 是组的名称,pattern 是要匹配的模式
捕获的值作为关键字参数而不是位置参数传递给视图函数

  1. url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage), 
  2. ''' 
  3. 补充:如果使用分组路由,需全部使用分组路由,否则会出现前后取不到的情况 
  4. ''' 
  5. url(r'^test/(?P<fff>\d+)/', views.test, name='t1'), 
  6. url(r'^test/(\d+)/(?P<fff>\d+)/', views.test, name='t1'), 
2.2 示例代码
  1. from django.conf.urls import url 
  2. from . import views 
  3.  
  4. urlpatterns = [ 
  5. url(r'^articles/2003/$', views.special_case_2003), 
  6. url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), 
  7. url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), 
  8. url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), 
  9.  
  10. ''' 
  11. 请求 
  12. /articles/2005/03/ 请求将调用views.month_archive(request, year='2005', month='03')函数,而不是views.month_archive(request, '2005', '03')。 
  13. /articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。 
  14. ''' 

3. 路由分发

  1. ''' 
  2. 请求: 
  3. /app01/index.html 
  4. 请求将匹配 urls.py中的'^app01/', 遇到路由分发'include('app01.urls')', 
  5. 请求将匹配 app01.urls.py 中的^index.html$', 调用 index 
  6. ''' 
3.1 urls.py
  1. from django.conf.urls import include, url 
  2.  
  3. urlpatterns = [ 
  4. url(r'^app01/', include('app01.urls')), 
3.2 app01.urls.py
  1. url(r'^index.html$', views.index), 

4. 反向解析

4.1 路由关系命名

设置名称后,可以在不同的地方调用

  1. url(r'^index/(\d*)', views.index1, name='h1'), 
  2. url(r'^index/(?P<hhh>\d*)', views.index2, name='h2'), 
4.2 视图函数中反向解析
  1. from django.urls import reverse 
  2.  
  3. def index1(request, *args): 
  4. ''' 
  5. 路由关系1 
  6. ''' 
  7. v = reverse('h1', args = (2012,)) # 注意args 后面加可迭代的元素 
  8. print(v) # index/2012 
  9. return HttpResponse('...'
  10.  
  11. def index2(request, *args, **kwargs): 
  12. ''' 
  13. 路由关系2 
  14. ''' 
  15. v = reverse('h2', kwargs = {'hhh': 2015}) # 注意args 后面加可迭代的元素 
  16. print(v) # index/2015 
  17. return HttpResponse('...'
  18.  
  19. ''' 
  20. 总结: 
  21. reverse 后不管是args还是kwargs 参数数值可改变 
  22. ''' 
4.3 模板中反向解析
  1. <!--路由关系1与2的方式相同--> 
  2. {% url 'h1' 2012 %} # 2012为随意填写数据 
  3.  
  4. <ul> 
  5. {% for item in data_list %} 
  6. <li><a href="{% url 'h1' item %}">{{ item }} Archive</a></li> 
  7. {% endfor %} 
  8. </ul> 
4.4 Model中反向解析

待整理

5. 名称空间

待整理

posted @ 2018-07-10 16:45  LexSama  阅读(227)  评论(0编辑  收藏  举报