2016-03-23 2 views
2

Ich habe eine Ansicht, die /accounts/login/?next=/amos/ umleiten sollte, wenn ein Benutzer versucht /amos zuzugreifen, wenn sie nicht angemeldet sind. Um Test dafür zu tun, ich die folgende Prüfung verwenden :Djangos Test-Client gibt eine nicht ordnungsgemäß codierte URL

Der Fehler tritt bei auf. Insbesondere hebt er diesen Fehler:

AssertionError: Response redirected to '/accounts/login/?next=/amos/', expected '/accounts/login/?next=%2Famos%2F' 

Offensichtlich kommt der Fehler von / nicht gleich %2F zu sein. Die Umleitungs-URL, die von response zurückgegeben wird, scheint nur eine unbearbeitete Zeichenfolge zu sein, während die selbstdefinierte Funktion eine ordnungsgemäß URL-codierte Zeichenfolge zurückgibt. Was soll ich in diesem Fall tun? Sollte ich es einfach nicht URL-encodieren oder ist das ein Problem mit ?

EDIT: Ich habe eine zuvor angehoben bug über auf der DjangoProject-Website gelesen. Nach dem, was ich verstanden habe, scheint dies das beabsichtigte Verhalten zu sein? Das heißt, innerhalb der internen Systeme von Django werden URLs nicht codiert. Wäre ein wenig Einblick von erfahreneren Menschen, danke!

Antwort

2

Wenn Sie Djangos redirect_to_login-Methode betrachten, die von den Dekoratoren wie login_required verwendet wird, können Sie sehen, dass es Schrägstriche als sicheres Zeichen behandelt und sie nicht codiert.

login_url_parts[4] = querystring.urlencode(safe='/') 

Sie könnten dieses Verhalten in Ihrem Test nachahmen. Ich denke jedoch, dass es am einfachsten wäre, die Zeichenfolge einfach nicht zu codieren. Es ist wichtig zu testen, dass anonyme Benutzer umgeleitet werden. Es sollte bereits Tests in Django geben, um sicherzustellen, dass die URL korrekt kodiert ist. Daher bin ich mir nicht sicher, ob es viel zu gewinnen gibt, wenn ich das wiederhole.

redirect_url = reverse('login') + '?next=/amos/' 
+0

Ooh, schöner Fang! Danke, dass du das für mich erledigt hast! Ich denke, ich werde das Verhalten in meiner 'url_with_querystring()' -Funktion nachahmen (um es zukunftssicher zu machen) –

+0

Um es einfach zu wiederholen, die EDIT: 'redirect_to_login' Methode URL korrekt codiert alles * außer * für Schrägstriche (I teste es mit '!'). Weißt du warum das so ist, @Alasdair? –

+0

Es ist nicht der Client, der die URL codiert - es ist die 'redirect_to_login' Methode, die von dem Decorator aufgerufen wird, den Sie in Ihrer Ansicht verwenden. – Alasdair

Verwandte Themen