2013-08-06 5 views
5

Ich dachte, ich hätte dies herausgefunden, aber gerade etwas seltsam entdeckt.Django, umleiten Benutzer für nicht erkannte URL (nicht nur 404 Vorlage)

In urls Ich habe

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

handle_page_not_found() die Benutzer entsprechend umleiten, wenn die URL nicht erkannt.

Das funktioniert gut, aber ich entdeckte etwas seltsam.

Wenn eine Funktion gibt

return HttpResponse("ok") 

dann „ok“ zurückgegeben und alles scheint gut zu funktionieren. ABER, ich habe gerade gesehen, dass handle_page_not_found() auch aufgerufen wird (ich habe mit einer print-Anweisung getestet). Es ist immer noch "ok", das zurückgegeben wird, aber zuerst wird der Code in handle_page_not_found() ausgeführt.

Also, wie kann ich eine Funktion haben, die für nicht erkannte URLs aufgerufen wird, aber die nicht von einem HttpResponse Objekt aufgerufen wird?

EDIT: Basierend auf Antwort, sah, dass mein Code ist in Ordnung, außer in speziellen Testsituation. Es ist alles gut, solange die HttpResponse zu einem Ajax-Aufruf zurückgegeben wird (das ist, wenn ich es normalerweise verwende).

Antwort

0

Die wahrscheinlichste Ursache ist, dass Ihr Browser mehrere Anforderungen an Ihre Website stellt.

Insbesondere könnte es versuchen, für /favicon.ico/ anzufordern.

Sie können sicher sein, indem Sie request.path anzeigen, wenn Ihr Handler aufgerufen wird.

+0

Sie haben Recht! request.path ist /favicon.ico/ Das hat mich dazu gebracht zu schauen und zu sehen, dass ich das Problem nicht habe, wenn ich eine HttpResponse zu einem Ajax-Aufruf zurückschicke. Und das ist tatsächlich das einzige Mal, dass ich das tue, abgesehen von der Testseite, die ich gerade gesehen habe. – user984003

+0

Kurze Version: alles ist gut. Mein Code funktioniert außer in speziellen Testsituationen. – user984003

+0

für mich glaube ich, dass es aufgrund des Ausdrucks in der letzten URL ist. Für jede beliebige Zeichenfolge wird handle_page_not_found aufgerufen, ändern Sie den Stern in etwas anderes. – drabo2005

3

vermeiden Sie die Sache damit, es funktioniert mit mir.

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)) 

Weitere Informationen finden Sie unter: Django documentation: customizing-error-views

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

     return response 
0

Es funktioniert für meine App mit Django v1.11.3 und Python v3.6.

Schritt 1. Fügen Sie view_404 in views.py wie folgt hinzu.

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

Schritt 2. Fügen Sie den Handler zu urls.py hinzu.

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