2011-04-25 36 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)。