2016-06-15 10 views
1

In meinem URLconf ich die folgende URL haben (wo login ist die eingebaute in Login-View-Funktion von django.contrib.auth.views):Ist Django Login Redirect Stripping meine URL-Parameter?

url(r'^login/', login, name='login', kwargs={ 
    'template_name': 'topspots/login.html', 
    'redirect_field_name': 'next', 
}) 

Dann in meiner Vorlage, in einer Navigationsleiste, die auf allen Seiten auf der Website vorhanden ist, ich habe folgende Login-Link:

<li><a href="{% url 'login' %}?next={{ request.get_full_path }}">Log in</a></li> 

Wenn ich die Login-Seite aus besuchen, zB die Suchergebnisseite, die uRL ich in der Adressleiste erhalten, ist so etwas wie:

http://localhost:8000/login/?next=/spots/search/?search_query=South+Oak+Park%2C+KCMO%2C+MO%2C+United+States&searchtype=default&latitude=38.97600750000001&longitude=-94.58623399999999 

, die mir richtig scheint (man beachte die longitude und latitude Parameter), denn nach der Anmeldung würde Ich mag zu

http://localhost:8000/spots/search/?search_query=South+Oak+Park%2C+KCMO%2C+MO%2C+United+States&searchtype=default&latitude=38.97600750000001&longitude=-94.58623399999999 

das heißt, der next Pfad umgeleitet werden. In der Anmeldesicht lautet der Wert {{ next }} jedoch /spots/search/?search_query=South Oak Park, KCMO, MO, United States. Mit anderen Worten, alle Parameter außer dem ersten wurden entfernt. Ich konnte nicht herausfinden, wann/wo/warum diese Parameter abgehackt werden. Ist das etwas, was Django macht, oder stammt es von einem Fehler von mir? Wenn es Django ist, bin ich mir sicher, dass es einen guten Grund dafür gibt, aber wenn ich nur etwas falsch mache, möchte ich es beheben. Irgendwelche Vorschläge? Vielen Dank!

Antwort

5

Was passiert, ist, dass die generierte URL endet wie so analysiert werden:

next=/spots/search/?search_query=South+Oak+Park%2C+KCMO%2C+MO%2C+United+States 
searchtype=default 
latitude=38.97600750000001 
longitude=-94.58623399999999 

Die zusätzlichen Parameter sind nicht mehr Teil der next URL, so dass sie runterfallen. Um dies zu vermeiden, kodieren die gesamte URL also bleibt es zusammen:

<li><a href="{% url 'login' %}?next={{ request.get_full_path|urlencode }}">Log in</a></li> 

Die & Zeichen codiert wird damit der Browser nicht mehr die Parameter teilt und sendet sie an die falsche URL.

Django documentation.

+1

Ja! Ich kann nicht glauben, dass es etwas so Einfaches war! Dies sollte wahrscheinlich etwas gewesen sein, das ich selbst hätte finden können, aber wenn ich mit einer unbekannten Technologie arbeite, stelle ich oft fest, dass ich nicht einmal weiß, wo ich hinschauen soll, oder die richtigen Fragen zu stellen. Danke, dass Sie mich in die richtige Richtung weisen! – elethan