web-dev-qa-db-fra.com

Django CSRF Cookie non défini

J'ai un problème depuis un moment, je suis confronté à un cookie CSRF non défini. Veuillez regarder les codes ci-dessous

Python

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

HTML

<form action="/deposit/{{ account_num }}/" method="post">

<table>
<tr>
{{ account_form.bal_change }}
&nbsp;
<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.

54
user2389182

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.

95
Druska
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'
})
13
user85461

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.

7
dscanon

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.

2
Pratik Mhatre

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.

1
sbaechler

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.

1
indspecter

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.

1
Gokul Yesudoss

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.

0
arp

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. 

0
shenqi0920

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))
0
Rohan

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>
0
drabo2005

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):
    ...
0
moszoro

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é).

0
IWS