8

我对 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

4

2 回答 2

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

于 2012-06-04T08:17:33.833 回答
1

你是对的,django doc告诉你:

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 调用适当的错误处理视图。请参阅下面的错误处理。

这也是另一个 SO 帖子建议解决另一个 URL 评估问题的方法。

于 2012-06-04T08:21:35.073 回答