2

我正在尝试构建一个小型 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),

但由于某种原因,它们没有工作。

我怎样才能使这项工作?

似乎其中一个 - 或两者 - 匹配相同的东西。

4

2 回答 2

3

按照更简洁的方法,我真的将编辑 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 调度的更多信息,请阅读此处

注意:正则表达式既强大又危险,尤其是在网络上时。保持简单,并确保真正理解您定义的内容,否则您的 Web 应用程序可能会面临多个安全问题。

有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。——杰米·扎温斯基

于 2012-07-30T16:20:00.080 回答
0

请尝试以下更简单的 URL:

url(r'_edit/(?P<page_name>[\w-]+), views.edit)'
url(r'(?P<page_name>[\w-]+), views.page),
于 2012-07-30T15:50:57.793 回答