我正在尝试构建一个小型 wiki,但在为其编写正则表达式规则时遇到问题。
我想做的是每个页面都应该有自己的编辑页面,当我在编辑页面上按提交时,它应该将我重定向到 wiki 页面。
我想在我的应用程序中包含以下网址:
http://example.com/<page_name>
http://example.com/_edit/<page_name>
我的 URLConf 有以下规则:
url(r'(_edit/?P<page_name>(?:[a-zA-Z0-9_-]+/?)*)', views.edit),
url(r'(?P<page_name>(^(?:_edit?)?:[a-zA-Z0-9_-]+/?)*)', views.page),
但由于某种原因它们没有工作。
我怎样才能做到这一点?
似乎其中一个或两个匹配相同的内容。
最佳答案
按照更简洁的方法,我实际上将编辑 URL 定义为:
http://example.com/<pagename>/edit
以我的拙见,这更清楚、更容易猜测。
然后,请记住 Django 会按照您定义的顺序循环您的 url 模式,并在第一个与传入请求匹配的情况下停止。因此它们定义的顺序非常重要。
回答您的问题:
^(?P<page_name>[\w]+)$
匹配对任何/PageName 的请求
请始终记住开头的插入符号和结尾的美元符号,这表示我们希望 URL 在正则表达式之前和之后分别开始和停止,否则任何前导或尾随符号/字符也会使正则表达式匹配(而在这种情况下您可能希望显示 404)。
^_edit/(?P<page_name>[\w]+)$
匹配编辑 URL(或 ^(?P<page_name>[\w]+)/edit$
,如果您喜欢用户友好的 URL,通常称为 REST url,而 RESTfullnes 是一个与 URL 样式无关的概念)。
总结将以下内容放入您的网址中:
url(r'^(?P<page_name>[\w]+)$', views.page)
url(r'^_edit/(?P<page_name>[\w]+)$', views.edit)
您可以通过更改 \w
轻松强制 URL 不包含某些特定字符。与您自己定义的集合。
了解有关 Django URL 调度的更多信息 read here .
注意:正则表达式既强大又危险,尤其是在网络上时。保持简单,并确保真正理解您定义的内容,否则您的 Web 应用程序可能会面临多个安全问题。
Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. -- Jamie Zawinski
关于python - 我如何为这些网址编写正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11724725/