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

154voto

Druska Points 828

Cela peut également se produire si CSRF_COOKIE_SECURE = True est activé et que vous accédez au site de manière non sécurisée ou si CSRF_COOKIE_HTTPONLY = True est fixé comme indiqué aquí y aquí

83voto

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")

26voto

user85461 Points 1620

Si vous utilisez le API HTML5 Fetch pour faire des demandes POST en tant qu'utilisateur connecté et obtenir Forbidden (CSRF cookie not set.) c'est peut-être parce que par défaut fetch n'inclut pas les cookies de session, ce qui fait que Django pense 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' pour aller chercher :

var csrftoken = getCookie('csrftoken');
var headers = new Headers();
headers.append('X-CSRFToken', csrftoken);
fetch('/api/upload', {
    method: 'POST',
    body: payload,
    headers: headers,
    credentials: 'include'
})

22voto

dscanon Points 80

Desde Ce site 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 testez à nouveau.

9voto

Alveona Points 610

Si vous utilisez DRF, vérifiez si vos urlpatterns sont corrects, peut-être avez-vous oublié .as_view() :

Voilà à quoi ressemblait mon code :

urlpatterns += path('resource', ResourceView) 

Et c'est comme ça que ça devrait être :

urlpatterns += path('resource', ResourceView.as_view())

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