我在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
答案 0 :(得分:4)
阅读Django document
Django如何处理请求
当用户请求您的网页时 Django驱动的站点,这是系统遵循的算法 确定要执行的Python代码:
- Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但是如果传入 HttpRequest对象有一个名为urlconf的属性(由中间件设置 请求处理),其值将用于代替 ROOT_URLCONF设置。
- Django加载Python模块并查找变量urlpatterns。这应该是一个Python列表,格式为 函数django.conf.urls.patterns()。
- Django按顺序遍历每个URL模式,并在第一个匹配请求的URL的位置停止。
- 一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数。视图通过了 HttpRequest作为其第一个参数和正则表达式中捕获的任何值 作为剩余的论点。
- 如果没有正则表达式匹配,或者在此过程中的任何点期间引发异常,Django将调用适当的错误处理视图。 请参阅下面的错误处理。
醇>
它说3. Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL.
所以我认为这是一个错误。
$
答案 1 :(得分:1)
你是对的,django doc告诉:
Django如何处理请求
当用户从Django支持的站点请求页面时,这是系统遵循的算法,以确定要执行的Python代码:
- Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但如果传入的HttpRequest对象具有名为urlconf的属性(由中间件请求处理设置),则将使用其值代替ROOT_URLCONF设置。
- Django加载Python模块并查找变量urlpatterns。这应该是一个Python列表,采用函数django.conf.urls.patterns()返回的格式。
- Django按顺序遍历每个URL模式,并在第一个匹配请求的URL的位置停止。
- 一旦其中一个正则表达式匹配,Django就会导入并调用给定的视图,这是一个简单的Python函数。视图通过了 HttpRequest作为其第一个参数和正则表达式中捕获的任何值 作为剩余的论点。
- 如果没有正则表达式匹配,或者在此过程中的任何一点期间引发异常,Django会调用适当的错误处理 视图。请参阅下面的错误处理。
醇>
这也是another SO post建议修复其他网址评估问题的原因。