J'ai un problème depuis un moment, je suis confronté à un cookie CSRF non défini. Veuillez regarder les codes ci-dessous
def deposit(request,account_num):
if request.method == 'POST':
account = get_object_or_404(account_info,acct_number=account_num)
form_=AccountForm(request.POST or None, instance=account)
form = BalanceForm(request.POST)
info = str(account_info.objects.filter(acct_number=account_num))
inf=info.split()
if form.is_valid():
#cd=form.cleaned_data
now = datetime.datetime.now()
cmodel = form.save()
cmodel.acct_number=account_num
#RepresentsInt(cmodel.acct_number)
cmodel.bal_change="%0.2f" % float(cmodel.bal_change)
cmodel.total_balance="%0.2f" %(float(inf[1]) + float(cmodel.bal_change))
account.balance="%0.2f" % float(cmodel.total_balance)
cmodel.total_balance="%0.2f" % float(cmodel.total_balance)
#cmodel.bal_change=cmodel.bal_change
cmodel.issued=now.strftime("%m/%d/%y %I:%M:%S %p")
account.recent_change=cmodel.issued
cmodel.save()
account.save()
return HttpResponseRedirect("/history/" + account_num + "/")
else:
return render_to_response('history.html',
{'account_form': form},
context_instance=RequestContext(request))
Dans le code HTML, voici le code
<form action="/deposit/{{ account_num }}/" method="post">
<table>
<tr>
{{ account_form.bal_change }}
<input type="submit" value="Deposit" />
</tr>
{% csrf_token %}
</table>
</form>
Je suis coincé, j'ai déjà supprimé le cookie, utilisé un autre navigateur mais le cookie CSRF n'est pas défini.
Cela peut également se produire si CSRF_COOKIE_SECURE = True
est défini et que vous accédez au site de manière non sécurisée.
from Django.http import HttpResponse
from Django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def your_view(request):
if request.method == "POST":
# do something
return HttpResponse("Your response")
Si vous utilisez HTML5 Fetch API pour effectuer des demandes POST en tant qu'utilisateur connecté et obtenant Forbidden (CSRF cookie not set.)
, il se peut que, par défaut, fetch
n'inclut pas les cookies de session, ce qui donne à Django l'impression que vous êtes un utilisateur différent de celui qui a chargé la page.
Vous pouvez inclure le jeton de session en passant l'option credentials: 'include'
à fetch:
var csrftoken = getCookie('csrftoken');
var headers = new Headers();
headers.append('X-CSRFToken', csrftoken);
fetch('/api/upload', {
method: 'POST',
body: payload,
headers: headers,
credentials: 'include'
})
De This Vous pouvez le résoudre en ajoutant le décorateur Ensure_csrf_cookie à votre vue
from Django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
#...
si cette méthode ne fonctionne pas. vous essayerez de commenter CSRF dans le middleware. et tester à nouveau.
Je suis tombé sur une situation similaire alors que je travaillais avec DRF. La solution consistait à ajouter la méthode .as_view () à la vue dans urls.py.
Ce problème est survenu récemment à cause d'un bogue dans Python lui-même.
http://bugs.python.org/issue22931
https://code.djangoproject.com/ticket/24280
Les versions 2.7.8 et 2.7.9 étaient concernées. Le cookie n'a pas été lu correctement si l'une des valeurs contenait un caractère [
.
La mise à jour de Python (2.7.10) corrige le problème.
J'utilisais Django 1.10 auparavant.Alors, je faisais face à ce problème . Je l'ai maintenant rétrogradé à Django 1.9 et cela fonctionne bien.
Cela se produit également lorsque vous ne définissez pas l'action de formulaire.
Pour moi, cela montrait cette erreur quand le code était:
<form class="navbar-form form-inline my-2 my-lg-0" role="search" method="post">
Quand j'ai corrigé mon code dans ceci:
<form class="navbar-form form-inline my-2 my-lg-0" action="{% url 'someurl' %}" role="search" method="post">
mon erreur a disparu.
Assurez-vous que le backend de votre session Django est correctement configuré dans settings.py. Alors essaie ça,
class CustomMiddleware(object):
def process_request(self,request:HttpRequest):
get_token(request)
Ajouter ce middleware dans settings.py
sous MIDDLEWARE_CLASSES ou MIDDLEWARE selon la version de Django
get_token - Retourne le jeton CSRF requis pour un formulaire POST. Le jeton est une valeur alphanumérique. Un nouveau jeton est créé s'il n'en est pas déjà un.
Méthode 1:
from Django.shortcuts import render_to_response
return render_to_response(
'history.html',
RequestContext(request, {
'account_form': form,
})
Méthode 2:
from Django.shortcuts import render
return render(request, 'history.html', {
'account_form': form,
})
Parce que la méthode render_to_response peut poser problème avec les cookies de réponse.
Le problème semble que vous ne gérez pas les demandes GET
de manière appropriée ou publiez directement les données sans obtenir le formulaire au préalable.
Lorsque vous accédez pour la première fois à la page, le client envoie la demande GET
. Dans ce cas, vous devez envoyer le code HTML avec le formulaire approprié.
Plus tard, l'utilisateur remplit le formulaire et envoie une demande POST
avec les données du formulaire.
Votre vue devrait être:
def deposit(request,account_num):
if request.method == 'POST':
form_=AccountForm(request.POST or None, instance=account)
if form.is_valid():
#handle form data
return HttpResponseRedirect("/history/" + account_num + "/")
else:
#handle when form not valid
else:
#handle when request is GET (or not POST)
form_=AccountForm(instance=account)
return render_to_response('history.html',
{'account_form': form},
context_instance=RequestContext(request))
essayez de vérifier si vous avez installé dans le settings.py
MIDDLEWARE_CLASSES = (
'Django.middleware.common.CommonMiddleware',
'Django.contrib.sessions.middleware.SessionMiddleware',
'Django.middleware.csrf.CsrfViewMiddleware',)
Dans le modèle, les données sont formatées avec le csrf_token:
<form>{% csrf_token %}
</form>
J'ai eu la même erreur, dans mon cas l'ajout de method_decorator aide:
from Django.views.decorators.csrf import csrf_protect
from Django.utils.decorators import method_decorator
method_decorator(csrf_protect)
def post(self, request):
...
Vérifiez que les cookies de chrome sont configurés avec l'option par défaut pour les sites Web. Autoriser le paramétrage des données locales (recommandé).