我正在创建一个应用程序,其中许多网址正在使用像/foo/bar/<object_id>/<object_name_slug>/
这样的模式,就像许多应用程序(包括SO)一样,这本身就是一种直接的模式。但是,我不想盲目地忽略slug字段的内容并打开应用程序,直到人们分发篡改URL(例如最近流行的http://www.independent.co.uk/life-style/food-and-drink/utter-PR-fiction-but-people-love-this-shit-so-fuck-it-lets-just-print-it-2269573.html)这样的愚蠢内容。
我的计划是,如果有人通过坏块(再次,如SO)到达页面,则将问题验证重定向到正确的URL。这在视图中实现起来是微不足道的,但由于这将是许多视图中使用的模式,我想将其分解为可重用的东西 - 可能是装饰器或中间件。
最好的方法是什么?装饰者是否可以确定特定请求匹配哪个url模式,以便在必要时生成反向?
感谢您的想法。
答案 0 :(得分:1)
您可以使用中间件。交叉检查Entry id(让我们假设您使用Entry模型进行内容。例如,您提到的URL中的ID将是2269573)及其slug(假设您的Entry模型当然有一个slug字段)。如果slug不正确,只需重定向到正确的页面。
为此,请创建一个类,并为其指定process_request方法。然后将此类添加到您的设置'MIDDLEWARE_CLASSES。
process_request接受一个“request”参数(一个HttpRequest对象),该对象有一个路径属性,可以为您提供所请求的URL。
根据该网址,您可以定义要执行的操作。
中间件类的方法应返回None或HttpRequest对象。后者可以是django.http.HttpResponseRedirect实例,这意味着您可以重定向到正确的URL(从而忽略不正确的slug)。