Wenn Sie versuchen, mit HttpResponseRedirect zu etwas anderem als http [s] oder ftp umzuleiten, tritt eine SuspiciousOperation-Ausnahme auf, wie unten gezeigt.
SuspiciousOperation: Unsafe redirect to URL with protocol 'com.example.app.sample0'
Sie können diese Ausnahme umgehen, indem Sie folgenden Code hinzufügen: Fügen Sie allow_schemes ein Umleitungsziel hinzu, für das Sie keine Ausnahme auslösen möchten.
try:
from django.http.response import HttpResponseRedirectBase
HttpResponseRedirectBase.allowed_schemes += ['com.example.app.sample0', ]
except ImportError:
pass
In Bezug auf den Import wurden in der alten Version django.http und darunter nicht in Antwort und Anforderung unterteilt. Wenn die Version von Django alt ist (etwa 1.4 oder früher, ich habe die detaillierte Version vergessen), ist der Import der folgende Code.
from django.http import HttpResponseRedirectBase
Wenn es sich innerhalb des Bereichs von Webseiten befindet, die normalerweise mit einem Browser angezeigt werden, ist es unwahrscheinlich, dass Sie zu einem anderen Umleitungsziel als http [s] und ftp springen möchten. Wenn Sie beispielsweise auf eine Smartphone-App abzielen, möchten Sie zu '[Name des App-Pakets]: //' umleiten (Beispiel: Wenn Sie mit OAuth die Kontrolle von der Authentifizierungs-URL an die App zurückgeben) und so weiter.
Diese Ausnahme bei der Umleitung wurde in der Django 1.4-Serie eingeführt.
Der tatsächliche Code von HttpResponseRedirectBase lautet wie folgt, und es ist leicht zu erkennen, dass das Umleitungsziel zu allow_schemes hinzugefügt werden sollte. Da der Code als Sicherheitsmaßnahme eingeführt wurde, ist es besser, das Umleitungsziel so weit wie möglich zu begrenzen, wie im obigen Beispiel.
response.py
class HttpResponseRedirectBase(HttpResponse):
allowed_schemes = ['http', 'https', 'ftp']
def __init__(self, redirect_to, *args, **kwargs):
parsed = urlparse(redirect_to)
if parsed.scheme and parsed.scheme not in self.allowed_schemes:
raise SuspiciousOperation("Unsafe redirect to URL with protocol '%s'" % parsed.scheme)
super(HttpResponseRedirectBase, self).__init__(*args, **kwargs)
self['Location'] = iri_to_uri(redirect_to)
url = property(lambda self: self['Location'])
Recommended Posts