2011-04-25 69 views
0

我正在创建一个应用程序,其中许多网址使用像/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)。验证URL段落

我的计划是验证slug的问题,重定向到正确的URL,如果有人通过糟糕的slu reaches达到一个页面(再次像SO)。这在视图中实现将是微不足道的,但由于这将是许多视图中使用的模式,所以我想将它分解成可重用的东西 - 可能是装饰器或中间件。

这样做的最好方法是什么?装饰器可以确定哪个url模式被特定的请求匹配,以便它可以在必要时生成反向?

感谢您的想法。

+0

可能重复的[URL重写,如何避免URL尴尬?](http://stackoverflow.com/questions/5730801/url-rewriting-how-to-avoid-url-embarrassment) – 2012-01-13 19:24:14

+0

请参阅:http:///stackoverflow.com/questions/4787731/canonical-links-and-301-redirect-if-url-doesnt-match-slug – 2012-01-19 06:24:22

回答

1

您可以为此使用中间件。交叉检查Entry id(让我们假设你使用Entry模型的内容,例如你提到的URL中的ID就是2269573)和它的slug(假设你的Entry模型有一个slug字段当然)。如果slug不正确,只是重定向到正确的页面。

为了做到这一点,创建一个类,并给它process_request方法。然后将此类添加到您的设置MIDDLEWARE_CLASSES中。

process_request接受一个“请求”参数(一个HttpRequest对象),并且这个对象有一个路径属性,它会给你请求的URL。

根据该URL,您可以定义要执行的操作。

中间件类的方法应返回None或HttpRequest对象。后者可以是django.http.HttpResponseRedirect实例,这意味着您可以重定向到正确的URL(从而忽略不正确的slug)。