这个url模式如何在Django中进行无限制检查?

时间:2012-03-08 23:18:33

标签: django django-urls

我认为它正在进行无限检查,因为Django从未到达build_history视图功能。

# CodeBundles
url(r"^cb/create/$", 'codebundle_create', name="codebundle_create"),
url(r"^cb/details/(?P<cbid>\w+)/$", 'script', name="codebundle_details"),
url(r"^cb/(?P<cbid>\w+)$", 'codebundle_browser', name="codebundle_browser"),
url(r"^cb/(?P<cbid>\w+)/(?P<path>\w+)$", 'codebundle_browser', name="codebundle_browser"),

#### url(r"^cb/(?P<cbid>\w+)/(?P<path>(.|\W|\w)+)/delete/$", "deletefile", name="deletefile"), 

url(r"^cb/newfile/$",   'codebundle_newfile',   name="codebundle_newfile"),
url(r"^cb/newfolder/$", 'codebundle_newfolder', name="codebundle_newfolder"),
url(r"^cb/build_history/(?P<cbid>\w+)/$", 'codebundle_build_history', name="codebundle_build_history"),
url(r"^cb/run_history/(?P<cbid>\w+)/$", 'codebundle_run_history', name="codebundle_run_history"),

请注意,那个被评论出来的是凶手。

当我启用该url模式时,我得到502 Bad Gateway,我不明白为什么。

Django主网址:http://192.168.1.138/natrium/

我转到codebundle_browser,网址都可以正常使用

http://192.168.1.138/natrium/cb/12343
http://192.168.1.138/natrium/cb/12343/./ABC

进入codebundle_browser页面后,我可以点击build_history,然后我会以502 Bad Gateway结束。

所以deletefile url模式导致无限制检查?但是build_history是一个不同的网址格式,如果请求网址是

,Django不应该足够智能去build_history
http://192.168.1.138/natrium/cb/build_history/12343/

感谢。

1 个答案:

答案 0 :(得分:1)

问题是你没有正确使用正则表达式。

在这里,您可以找到有关python中的regexp的文档:http://docs.python.org/library/re.html

这样的规则:

url(r"^cb/(?P<cbid>\w+)$", 'codebundle_browser', name="codebundle_browser"),
url(r"^cb/newfile/$",   'codebundle_newfile',   name="codebundle_newfile"),

基本上重叠,因为\w+可能意味着newfile。 (由于额外的/,它可能不会重叠,但是django使用约定将/附加到url的末尾)

对于ids(数字),您应该使用仅匹配数字(任何数字一次或多次)的(?P<cbid>\d+)。 对于任何您可以使用.+(任何符号一次或多次)的任何内容

我还建议您遵循RESTful URI设计目标http://redrata.com/restful-uri-design/