Django如何实现捕获所有URL但不影响APPEND_SLASH的功能?

32

我在urls.py中设置了一个通配符,如果在数据库中找到相应的页面,则加载一个简单的视图。但是这种方法的问题在于URL解析器将永远不会失败,这意味着APPEND_SLASH功能不会启动-我需要它。

我不想添加前缀来阻止它成为通配符。我知道flatpages使用404钩子而不是urls.py中的条目,我本来希望避免使用它,但我猜这个问题可能正是人们使用它的原因。

是否有任何解决此问题的方法,或者我应该放弃并使用flatpages?

2个回答

80

请确保您的通配符URL模式末尾有一个斜杠,并且该模式是URLconf中的最后一个。如果通配符模式没有以斜杠结尾,则它将在中间件尝试添加斜杠之前匹配到杂散的URL。

例如,使用r'^.*/$'而不是r'^.*'作为您的最后一个模式。

要实现相同的效果,但将url作为命名参数传递给视图,请使用r'^(?P<url>.*)/$'


我会接受你的答案。我也在处理同样的问题,但我不能再次提问了,我只能给一个赞。太棒了。 - B Robster
我已经完成了这个项目,所以无法测试它。但是它很有道理,Ben的反馈也很鼓舞人心,所以我会接受它。 - nedned
2
唯一的缺点是,没有尾部斜杠的 URL 将不再被捕获。 - Jad S
4
@JadS,它确实会捕获没有斜杠结尾的URL,因为中间件会在与模式进行比较之前将其附加到任何没有斜杠的URL上。如果您的设置中有APPEND_SLASH=False,则您是正确的,该解决方案将无法捕获这些URL。然而,OP明确提到了这个设置。 - Arthur Hebert-Ryan
使用flatpages应用程序时,r'^(?P<url>.*)/$'会导致添加重复的尾部斜杠。从正则表达式中省略斜杠(保留r'^(?P<url>.*)$')可以解决这个问题。 - Micah Walter
Django警告说应该删除$符号。 - Vaibhav Vishal

0

如果在数据库中找到了适当的静态页面,那么这个语句似乎表明你的静态页面并不是完全静态的。因此,你可以像现在一样通过urls.py传递链接,或者将这些页面从数据库中提取出来,放入一个目录中,并将该目录配置为用于提供静态文件的目录。


好的,其实并不是严格意义上的静态文件。事实上,它们实际上会在非常简单的模板中解析为 markdown,因此无法作为 html 文件提供。所以,"静态"这个词有些误导...好吧,实际上是完全错误的。我已经编辑了问题,删除了那个描述。我之所以不手动添加每个条目的原因是,我希望它的功能类似于内容管理系统(CMS),用户可以创建页面而不必接触源文件。 - nedned

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接