一个干净的,优雅的URL 方案是一个高质量Web 应用程序的重要细节。

这节我们来看看django是如何做到干净优雅的url的

1:Django如何处理一个请求

  1. 通过ROOT_URLCONF决定根URLCONF
  2. 调用所有的python模块找到urlpatterns(必须是一个列表)
  3. 按照顺序遍历url pattern,知道找到第一个匹配的项
  4. 如果找到,调用相应的view函数。。。
  5. 如果没找到,调用合适的错误处理函数

简单的url示例

from django.conf.urls import patterns, url, include

urlpatterns = patterns('',
(r'^articles/2003/$', 'news.views.special_case_2003'),
(r'^articles/(\d{4})/$', 'news.views.year_archive'),
(r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
)
  • /articles/2003/03/03/会匹配最后一个 pattern. Django 会调用函数news.views.article_detail(request, '2003', '03', '03').
  • /articles/2005/3/ 一个也没有匹配上

命名组

格式为(?P<name>pattern)

示例如下

urlpatterns = patterns('',
(r'^articles/2003/$', 'news.views.special_case_2003'),
(r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', 'news.views.article_detail'),
)

这个示例和上面的示例是一样的功能,不过不同的地方是:上面的示例传的是位置参数,命名组的参数的关键字参数,这意味着你可以调整参数的位置

  • /articles/2005/03/ 会调用函数news.views.month_archive(request, year='2005', month='03'), 而不是news.views.month_archive(request, '2005', '03').

事实上这不是很推荐的写法,不仅使得代码冗长,丑陋,事实上没这个必要,除非你确实想这么做

值得注意的是:

如果存在任何的命名组参数,那么非命名组参数将会被忽略;如果不存在命名组参数,所有的非命名组参数将按照顺序以位置参数的方式传进来

url(regexviewkwargs=Nonename=Noneprefix='')

1:如果你有多个view函数的前缀一样,例如

urlpatterns = patterns('',
(r'^articles/(\d{4})/$', 'news.views.year_archive'),
(r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
)

你可以这样写

urlpatterns = patterns('news.views',
(r'^articles/(\d{4})/$', 'year_archive'),
(r'^articles/(\d{4})/(\d{2})/$', 'month_archive'),
(r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'article_detail'),
)

2:如果你想引用其他的urlconf文件,你可以使用include这样写

urlpatterns = patterns('',
# ... snip ...
(r'^comments/', include('django.contrib.comments.urls')),
(r'^community/', include('django_website.aggregator.urls')),
(r'^contact/', include('django_website.contact.urls')),
(r'^r/', include('django.conf.urls.shortcut')),
# ... snip ...
)

3:如果你不想引用外部的urlconf,你还可以这样写

extra_patterns = patterns('',
url(r'^reports/(?P<id>\d+)/$', 'credit.views.report', name='credit-reports'),
url(r'^charge/$', 'credit.views.charge', name='credit-charge'),
) urlpatterns = patterns('',
url(r'^$', 'apps.main.views.homepage', name='site-homepage'),
(r'^help/', include('apps.help.urls')),
(r'^credit/', include(extra_patterns)),
)

4:当你给include配置额外参数的时候,这个额外参数会被附加到被include的urlconf文件的每一条url pattern里面

#Set one:
# main.py
urlpatterns = patterns('',
(r'^blog/', include('inner'), {'blogid': 3}),
)
# inner.py
urlpatterns = patterns('',
(r'^archive/$', 'mysite.views.archive'),
(r'^about/$', 'mysite.views.about'),
)
#Set two:
# main.py
urlpatterns = patterns('',
(r'^blog/', include('inner')),
)
# inner.py
urlpatterns = patterns('',
(r'^archive/$', 'mysite.views.archive', {'blogid': 3}),
(r'^about/$', 'mysite.views.about', {'blogid': 3}),
)

这两个set是一样的意思

5:如果两个url pattern被同一个view函数处理,那么当在模板中使用url指令的时候就会发生冲突,这时候url的name参数就可以派上用场了

urlpatterns = patterns('',
url(r'^archive/(\d{4})/$', archive, name="full-archive"),
url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"),
)
{% url arch-summary 1945 %}
{% url full-archive 2007 %}

需要注意的是,保证你使用的name参数在整个项目里面是唯一的,否则还是有可能发生冲突的

p

最新文章

  1. 【原创】内核ShellCode注入的一种方法
  2. net软件自动生成开发编程框架编程机器人
  3. MFC 配合 protobuff libevent 实现的Socket 的GM工具 框架
  4. 《热血传奇2》wix、wil文件解析Java实现
  5. bzoj1346: [Baltic2006]Coin
  6. 【英语】Bingo口语笔记(61) - mind系列
  7. ubuntu下设置开机自启动项
  8. myeclipse 编码问题
  9. Controlling Access in Java
  10. XLSTransformer生成excel文件简单演示样例
  11. Windows 8实例教程系列 - 布局控制
  12. Openfire分析之二:主干程序分析
  13. ASP.NET MVC5 实现基于Quartz.NET任务调度
  14. 使用nmon进行系统监控
  15. jquery判断选择元素是否存在
  16. 【leetcode 简单】 第一百零七题 回旋镖的数量
  17. XSS学习笔记
  18. 18-spring学习-AOP深入操作
  19. NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第二轮Day2题解
  20. 7.15实习培训日志 java题解

热门文章

  1. BZOJ2654 &amp; 洛谷2619:tree——题解
  2. BZOJ2816:[ZJOI2012]网络——题解
  3. HDU5306:Gorgeous Sequence——题解
  4. bzoj1211: [HNOI2004]树的计数(purfer编码)
  5. BAT-Java必考面试题集
  6. js正则:两边字符固定,中间任意字符
  7. java removeAll和重写equals、hashcode引起的性能问题
  8. 耐心排序Patience Sorting
  9. jsp03( javabeans)
  10. HDFS fs 基本命令