Django url模式顺序和正则表达式

时间:2014-08-29 08:46:17

标签: python regex django url-pattern

我无法理解我的应用程序正在发生的事情。 这就是django文档所说的。

  
      
  1. Django按顺序遍历每个URL模式,并在第一个匹配请求的URL的位置停止。
  2.   

这是我的网址模式。

urlpatterns = patterns('',

    #rosa
    url(r'^league/(.+)/rose/$','fantacalcio.views.rose',name='rose'),
    #league page
    url(r'^league/(.+)/$', 'fantacalcio.views.league_home',name='league_home'),  
)

这是我期望工作的网址模式:

urlpatterns = patterns('',

    #league page
    url(r'^league/(.+)/$', 'fantacalcio.views.league_home',name='league_home'),   
    #rosa
    url(r'^league/(.+)/rose/$','fantacalcio.views.rose',name='rose'),  
)

但是反而给了我这个错误:

ValueError at /league/1/rose/
invalid literal for int() with base 10: '1/rose'

这种情况正在发生,因为/league/1/rose/league/1/停止,根据我的理解,不会移动到下一个网址。我不明白为什么,因为在django文档中我可以找到这个例子:

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

我错过了什么?

1 个答案:

答案 0 :(得分:1)

因为模式(.+) 匹配 1/rose。你不是仅限于字母数字字符,所以它抓住了一切。

您已经知道交换正则表达式的顺序有效。但无论如何,你可能想限制它匹配的东西。如果你只想要数字ID,那就更好了:

'^league/(\d+)/$'

或者你可以匹配字母数字字符:

'^league/(\w+)/$'

甚至除了斜线之外的所有内容:

'^league/([^/]+)/$'