Si vous essayez de rediriger vers autre chose que http [s] ou ftp en utilisant HttpResponseRedirect, vous obtiendrez une exception SuspiciousOperation comme indiqué ci-dessous.
SuspiciousOperation: Unsafe redirect to URL with protocol 'com.example.app.sample0'
Vous pouvez contourner cette exception en ajoutant un code comme celui-ci: Vous pouvez ajouter une destination de redirection à allowed_schemes que vous ne souhaitez pas lever d'exception.
try:
from django.http.response import HttpResponseRedirectBase
HttpResponseRedirectBase.allowed_schemes += ['com.example.app.sample0', ]
except ImportError:
pass
En ce qui concerne l'importation, dans l'ancienne version, django.http et les versions antérieures n'étaient pas divisées en réponse et requête. Ainsi, lorsque la version de Django est ancienne (environ la série 1.4 ou antérieure, j'ai oublié la version détaillée), l'importation est le code suivant.
from django.http import HttpResponseRedirectBase
S'il se trouve dans la plage des pages Web qui sont normalement affichées avec un navigateur, il est peu probable que vous souhaitiez passer à une destination de redirection autre que http [s] et ftp. Par exemple, lorsque vous ciblez une application pour smartphone, vous souhaitez rediriger vers "[nom du package d'application]: //" (exemple: lors du renvoi du contrôle de l'URL d'authentification vers l'application avec OAuth), etc.
Cette exception lors de la redirection a été introduite dans la série Django 1.4.
Le code réel de HttpResponseRedirectBase est le suivant, et il est facile de voir que la destination de la redirection doit être ajoutée à allowed_schemes. Étant donné que le code a été introduit comme mesure de sécurité, il est préférable de limiter la destination de redirection autant que possible comme dans l'exemple ci-dessus.
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