我正在尝试构建一个小型 wiki,但在为其编写正则表达式规则时遇到了问题。
我想做的是每个页面都应该有自己的编辑页面,当我在编辑页面上按提交时,它应该将我重定向到 wiki 页面。
我想在我的应用程序中包含以下 url:
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
