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

Sam*_*dra 8 python regex django-urls

我在urls.py中使用正则表达式时遇到了一些问题(我是django的初学者以及一般的正则表达式)

这是我原来的urls.py

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

我试图使用这个来访问它:

http://127.0.0.1:8000/name/blah/
Run Code Online (Sandbox Code Playgroud)

我的观点如下:

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)
Run Code Online (Sandbox Code Playgroud)

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

但后来,我把第二个改为:

url(r'^$', 'course.views.index'),
Run Code Online (Sandbox Code Playgroud)

而这正是我认为它工作的方式!

我知道"$"表示行尾,但是第一个正则表达式是不是已经被评估过了?这些表达式匹配的顺序是什么?

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

我正在使用Django1.4和Python 2.7

shi*_*zhi 4

阅读 Django文档

Django 如何处理请求

当用户从 Django 驱动的站点请求页面时,系统将遵循以下算法来确定要执行的 Python 代码:

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

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

您应该添加$每个 url 模式,除非Including other URLconfs