django中的urls.py正则表达式评估顺序是什么?

时间:2012-06-04 08:01:59

标签: python regex django-urls

我在urls.py中有正则表达式的一些问题(我是django的初学者以及一般的正则表达式)

这是我原来的urls.py

url(r'^name/(?P<name>\w+)/$', 'course.views.name'),
url(r'^', 'course.views.index'),

我试图使用它来访问它:

http://127.0.0.1:8000/name/blah/

我的观点如下:

def index(request):
    return HttpResponse("Hello, sam. You're at the course index.")

def name(request, name):
    return HttpResponse("Hello, %s. You're at the course index." % name)

我得到的结果是,无论我给出什么输入,我都会定期获得“索引”功能,而不是“名称”功能。我认为问题出在第一个正则表达式上。

然而,我把第二个改为:

url(r'^$', 'course.views.index'),

这就是我认为它起作用的方式!

我理解“$”表示行结束,但是不应该首先评估第一个正则表达式吗?这些表达式匹配的顺序是什么?

在每个网址上添加“$”并不是什么大不了的事,但我想理解为什么要把它放在那里。

我正在使用Django1.4和Python 2.7

2 个答案:

答案 0 :(得分:4)

阅读Django document

  

Django如何处理请求

     

当用户请求您的网页时   Django驱动的站点,这是系统遵循的算法   确定要执行的Python代码:

     
      
  1. Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但是如果传入   HttpRequest对象有一个名为urlconf的属性(由中间件设置   请求处理),其值将用于代替   ROOT_URLCONF设置。
  2.   
  3. Django加载Python模块并查找变量urlpatterns。这应该是一个Python列表,格式为   函数django.conf.urls.patterns()。
  4.   
  5. Django按顺序遍历每个URL模式,并在第一个匹配请求的URL的位置停止。
  6.   
  7. 一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数。视图通过了   HttpRequest作为其第一个参数和正则表达式中捕获的任何值   作为剩余的论点。
  8.   
  9. 如果没有正则表达式匹配,或者在此过程中的任何点期间引发异常,Django将调用适当的错误处理视图。   请参阅下面的错误处理。
  10.   

它说3. Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL.所以我认为这是一个错误。

除非Including other URLconfs

,否则您应在每个网址格式中添加$

答案 1 :(得分:1)

你是对的,django doc告诉:

  

Django如何处理请求

     

当用户从Django支持的站点请求页面时,这是系统遵循的算法,以确定要执行的Python代码:

     
      
  1. Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但如果传入的HttpRequest对象具有名为urlconf的属性(由中间件请求处理设置),则将使用其值代替ROOT_URLCONF设置。
  2.   
  3. Django加载Python模块并查找变量urlpatterns。这应该是一个Python列表,采用函数django.conf.urls.patterns()返回的格式。
  4.   
  5. Django按顺序遍历每个URL模式,并在第一个匹配请求的URL的位置停止。
  6.   
  7. 一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数。视图通过了   HttpRequest作为其第一个参数和正则表达式中捕获的任何值   作为剩余的论点。
  8.   
  9. 如果没有正则表达式匹配,或者在此过程中的任何一点期间引发异常,Django会调用适当的错误处理   视图。请参阅下面的错误处理。
  10.   

这也是another SO post建议修复其他网址评估问题的原因。