Как этот шаблон URL вызывает бесконечную проверку в Django? - PullRequest
1 голос
/ 09 марта 2012

Я думаю, что он проводит бесконечную проверку, потому что Джанго никогда не достигает 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"),

Обратите внимание, что парень комментируется как убийца.

Я понимаю 502 Bad Gateway когда я включаю этот шаблон URL, и я не понимаю, почему.

Основной URL Django: http://192.168.1.138/natrium/

Я перехожу на codebundle_browser, либо URL-адреса будут работать нормально

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 - это другой шаблон URL, не должен ли Django быть достаточно умным, чтобы перейти к build_history, если URL запроса

http://192.168.1.138/natrium/cb/build_history/12343/

Спасибо.

1 Ответ

1 голос
/ 09 марта 2012

Проблема в том, что вы не используете регулярное выражение должным образом.

Здесь вы можете найти документацию по регулярному выражению в python: 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-адреса)

Для идентификаторов (чисел) вы должны использовать (?P<cbid>\d+), который соответствует только цифрам (любые цифры один или несколько раз).Для чего-либо между вы можете использовать .+ (любой символ один или несколько раз)

Я также рекомендую вам следовать целям разработки RESTful URI http://redrata.com/restful-uri-design/

...