【问题标题】:Django url pattern order and regexDjango url 模式顺序和正则表达式
【发布时间】:2014-10-23 06:10:23
【问题描述】:

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

  1. Django 按顺序运行每个 URL 模式,并在第一个匹配请求的 URL 时停止。

这是我的有效网址模式。

urlpatterns = patterns('',

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

这是我希望工作的 url 模式:

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'),
)

我错过了什么?

【问题讨论】:

    标签: python regex django url-pattern


    【解决方案1】:

    因为模式(.+) 匹配 1/rose。您不仅限于字母数字字符,因此它可以抓取所有内容。

    您已经知道交换正则表达式的顺序是可行的。但无论如何,您可能想限制它匹配的内容。如果您只期望数字 ID,这会更好:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-01
      • 2012-06-17
      • 2011-03-22
      • 2013-07-26
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多