Comment faire pour convertir un Django HttpResponse à un Django rendu d'appel
J'ai le code suivant
def ajax_login_request(request):
try:
request.POST[u'login']
dictionary = request.POST
except:
dictionary = request.GET
user = authenticate(username = dictionary[u'login'], password = dictionary[u'password'])
if user and user.is_active:
login(request, user)
result = True
else:
result = False
response = HttpResponse(json.dumps(result), mimetype = u'application/json')
return response
qui est appelé par ajax. Je suis un noob et c'est à partir d'un exemple dans un livre. Malheureusement la version de Django, je suis en utilisant jette un CSRF erreur sur ce point. J'ai fait l'autre CSRF bits, mais je ne sais pas comment changer la HttpResponse peu pour un rendu en appel. Je ne veux pas utiliser CSRF_exempt, parce que je n'ai aucune idée de quand cela est approprié. Quelqu'un peut-il svp me donner l'équivalent de rendu en appel pour le HttpResponse ci-dessus.
Grâce
Vous devez vous connecter pour publier un commentaire.
Pour faire de votre code original de travail, vous devez obtenir un RequestContext objet et de le passer avec votre réponse, quelque chose comme ceci:
Faire lire sur le CSRF de la documentation comme vous pouvez l'exécuter dans d'étranges erreurs si vous ne comprenez pas tous les moyens CSRF est "câblé" dans votre application. La page possède également un extrait de code javascript pour s'assurer CSRF des cookies sont envoyés avec vos requêtes ajax si vous les envoyer sans une forme.
Vous pouvez également utiliser le render_to_response() raccourci, mais vous auriez besoin d'un modèle de charge (dans votre cas, vous n'avez pas besoin d'un modèle, d'où le "dummy" modèle " dans mon exemple).
{% autoescape off %}{{result}}{% endautoescape %}
autoescape=False
sur leContext
Ok, je vais re-projet de cette réponse si vous comprenez où je veux en venir. Les CSRF middleware fonctionne comme ceci:
En d'autres termes, si vous voyez une 403 csrf page, votre point de vue n'a jamais été appelé. Vous pouvez le vérifier en coller une fausse impression de la déclaration de la vue et de regarder la sortie de
runserver
lorsque vous faites votre demande.Pour résoudre ce problème, vous devez désactiver csrf (pas bien) ou l'utilisation l'une des méthodes ajax disponible pour vous. Si le jeton est transmis à votre avis sera effectivement réalisée.
La raison que votre vue n'est pas appelé est d'empêcher l'action de l'forgé site de en fait jamais lieu - par exemple, si vous avez refusé le modèle à temps de réponse de l'utilisateur est déjà connecté. Le même comportement se produit avec la fonction décorateurs.
Comme pour le middleware réglage du cookie, qui ne modifie pas ou dépendent de la fonction rendu à tous - ceci définit l'en-tête HTTP
Cookie: ...
dans la réponse. Toutes les réponses dans Django sontHttpResponse
objets jusqu'à ce que finalement il les convertit en sortie;render
fonctions sont des aides, mais ce n'est pas ce qui est à l'origine de votre problème ici.Modifier je vais convertir ce que vous avez à un rendu en appel. Vous pouvez faire ceci:
Où
ajax_templates/login_response.html
est juste:Que c'est.
HttpResponse
a un principal défaut de l'argument qui est la chaîne de retour (littéralement, le html de la page web); c'est ce que vous êtes en train de faire au départ.render_to_response
etrender
sont des raccourcis de ce qui ce faire:RequestContext
docs.djangoproject.com/en/dev/ref/templates/api/...> pour le modèle, au lieu de <code>le Contexte</code>.</li>