Django,重定向用户无法识别的网址(不只是404模板)

时间:2013-08-06 06:13:56

标签: django

我以为我弄明白了,但发现了一些奇怪的东西。

我在网址中

url('^page_1/$', handle_page_1),
url('^page_2/$', handle_page_2), 
url('^.*/$', handle_page_not_found),
如果无法识别网址,

handle_page_not_found()会相应地重定向用户。

这很好,但我发现了一些奇怪的东西。

如果函数返回

return HttpResponse("ok")

然后返回“确定”,一切似乎都正常。但是,我刚刚看到handle_page_not_found()也被调用(我用print语句测试过)。它仍然是“ok”返回,但它首先在handle_page_not_found()中执行代码。

那么,我怎么能有一个为无法识别的URL调用的函数,但是HttpResponse对象不会调用它?

编辑:基于答案,看到我的代码实际上很好,除非在特殊测试情况下。只要将HttpResponse返回到ajax调用(这是我通常使用它的时候),这一切都很好。

4 个答案:

答案 0 :(得分: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 :(得分:1)

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

         return response

答案 2 :(得分:0)

最可能的原因是您的浏览器正在向您的网站发出多个请求。

特别是,它可能会尝试请求/favicon.ico/

您可以通过在调用处理程序时显示request.path来确定。

答案 3 :(得分: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)