Django urls.py 中的正则表达式

Posted

技术标签:

【中文标题】Django urls.py 中的正则表达式【英文标题】:regex in Django urls.py 【发布时间】:2012-07-22 05:54:45 【问题描述】:

请帮我修复 urls.py 人们建议这样,但它对我不起作用......

#urls.py
  (r'^/user/(?P<username>)/subject/([\w|\W]+)/$', subject),

#template
 % for subject in subjects %
    <li><a href="/user/ user.username /subject/ subject.name "> subject.name </a>  del_form.delete </li>
 % endfor %

#error
PAGE NOT FOUND
Request URL:    http://127.0.0.1:8000/user/root/subject/Math%20140
....
....
^/user/(?P<username>)/subject/([\w|\W]+)/$

【问题讨论】:

我不了解 django,但您的正则表达式要求 URL 以 / 结尾,而您的测试 URL (127.0.0.1....MATH%20140) 不以 / 结尾。您可以将其设为可选或将其删除。此外,[\w|\W]+ 应该是[\w\W]+,因为|[] 中没有任何意义。 (那为什么不只做.+ 呢?你在[\w\W] 中包含新行,而. 没有) 在某种程度上,这也取决于是否设置了多行标志(m),我认为不是。第二个问题可能是 URL 是 url 编码的,而主题可能不是。 Django 默认添加斜杠到 URL。 url 编码问题可能最好通过添加不包含空格等的主题 slug 或使用 the slugify filter (并尝试在视图中反转 - 可能最好只添加实际的 SlugField 以避免困难那里)。 @Dougal 这是个好建议! 【参考方案1】:

您的正则表达式有误。如果您对此不熟悉,则应该使用正则表达式生成器:

http://ryanswanson.com/regexp/ (Perl)

http://www.pyregex.com/ (Python)

我想你想要这样的东西:

^user/(?P<username>.+)/subject/([\w|\W]+)/

但您可能希望将“.+”更改为更具限制性的内容:

^user/(?P<username>[^/]+)/subject/([\w|\W]+)/

还请注意,由于 Django 将初始 URL 提供给 URL 调度程序的方式,您可能不希望使用前导斜杠。

【讨论】:

以上是关于Django urls.py 中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Django中关于URL配置文件urls.py的理解

Django 路由 urls.py

Django的urls(路由)

Django:如何访问中间件类中的 URL 正则表达式参数?

升级到Django 2.1的urls.py路径中的语法错误

使用 django 的 URL 和正则表达式