2013-08-06 24 views
5

我以爲我有這個想法,但只是發現了一些奇怪的東西。Django,重定向用戶無法識別的url(不僅僅是404模板)

在URL中我有

url('^page_1/$', handle_page_1), 
url('^page_2/$', handle_page_2), 
url('^.*/$', handle_page_not_found), 

handle_page_not_found()適當地將用戶重定向如果該URL無法識別。

工作正常,但我發現了一些奇怪的東西。

如果函數返回

return HttpResponse("ok") 

然後「確定」返回,一切似乎很好地工作。但是,我剛剛看到handle_page_not_found()也被稱爲(我用打印語句測試過)。返回的結果仍然「OK」,但它首先執行handle_page_not_found()中的代碼。

那麼,我怎樣纔能有一個功能,被稱爲無法識別的網址,但這不是由HttpResponse對象調用?

編輯:根據回答,看到我的代碼實際上很好,除了在特殊的測試情況。只要將HttpResponse返回給ajax調用(這是我通常使用它的時候)就可以了。

回答

0

最有可能的原因是您的瀏覽器正在對您的網站進行多重請求。

特別是,它可能試圖請求/favicon.ico/

當您的處理程序被調用時,您可以確定顯示request.path

+0

你說得對! request.path是/favicon.ico/這讓我看到,當我將HttpResponse返回給ajax調用時,我沒有問題。這實際上是我唯一一次這樣做,除了我現在看到的測試頁面。 – user984003

+0

簡版:一切都很好。我的代碼在特殊測試情況下工作。 – user984003

+0

對我來說,我相信這是由於在最後一個網址中的表達。對於任何字符串,它會調用handle_page_not_found,將明星更改爲其他內容。 – drabo2005

3

避免這個問題,它適用於我。

urls.py:

urlpatterns = patterns('', 
url('^page_1/$', handle_page_1), 
url('^page_2/$', handle_page_2), 
) 
handler404='views.handle_page_not_found_404' 

views.py:

def handle_page_not_found_404(request): 

page_title='Page Not Found' 
return render_to_response('404.html',locals(),context_instance=RequestContext(request)) 

有關詳細信息,請參閱:Django documentation: customizing-error-views

1
class Redirect404Middleware(object): 
    def process_response(self, request, response): 
     if response == Http404: 
      return HttpResponsePermanentRedirect('/') 

     return response 
0

它爲我的應用程序使用Django v1.11.3和python v3.6。

第1步。在views.py中添加view_404,如下所示。

def view_404(request): 
    # do something 
    return redirect('/') 

第2步。在urls.py上添加處理程序。

url(r'^.*/$', views.view_404)