110 votes

Django CSRF Cookie Not Set

J'ai un problème depuis un certain temps maintenant, j'ai un CSRF Cookie not set. 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 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à effacé le cookie, utilisé un autre navigateur mais le cookie csrf n'est toujours pas installé.

0voto

arp Points 55

Assurez-vous que votre backend de session django est correctement configuré dans settings.py. Essayez ensuite ceci,

class CustomMiddleware(object):
  def process_request(self,request:HttpRequest):
      get_token(request)

Ajouter ce middleware dans settings.py sous MIDDLEWARE_CLASSES o MIDDLEWARE selon la version de django

get_token - Renvoie le jeton CSRF requis pour un formulaire POST. Le jeton est une valeur alphanumérique. Un nouveau jeton est créé s'il n'est pas déjà défini.

0voto

moszoro Points 13

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

0voto

Al Mahdi Points 110

Si vous n'utilisez pas {% csrf_token %} dans le modèle que vous rendez. Django ne définira pas la balise csrftoken cookie.

Pour forcer django à définir le cookie csrftoken, ajoutez assurer_csrf_cookie décorateur à vos yeux.

from django.views.decorators.csrf import ensure_csrf_cookie

@ensure_csrf_cookie
def myview(request):

0voto

xjcl Points 608

Dans mon cas particulier, le problème est que j'utilisais l'application Django rest_framework et j'ai oublié d'ajouter les décorateurs suivants à ma fonction :

from rest_framework.decorators import api_view, renderer_classes

@api_view(('POST',))
@renderer_classes((JSONRenderer,))
def handle_web_request(request):
    ...

0voto

Je veux juste signaler mon cas ici, car quelqu'un pourrait traverser les mêmes champs.

Forbidden (CSRF cookie not set.): /main/staff/products/validation/create
HTTP POST /main/staff/products/validation/create 403 [0.01, 127.0.0.1:55940]

Ce truc me rendait fou... Donc, en commentant le middleware CSRF

 MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
 # 'django.middleware.csrf.CsrfViewMiddleware',
)

cela m'a donné

POST Method not allowed.

C'était mon indice, après tout. J'étais sûr que la méthode Post était présente. Il s'avère que mon url_patterns menait à une autre vue par un bug regex.

Donc peu importe ce que je faisais à mon avis, @csrf_exempt @ensure_crsf_cookie à la recherche de .as_view() ... Je regardais la mauvaise vue.

Donc, si rien ne fonctionne, vérifiez que vous êtes bien envoyé vers la bonne vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X