【问题标题】:Django: CSRF verification failedDjango:CSRF 验证失败
【发布时间】:2011-08-25 16:38:30
【问题描述】:

不知道如何解决这个问题:/。

views.py:

# coding: utf-8
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.views.generic.simple import direct_to_template
from django.core.mail import send_mail
from django.template import Context, loader
from django.conf import settings
from sklep.models import Produkt
from sklep.forms import ZamowienieForm
from django.core.context_processors import csrf

def koszyk(request):
    koszyk = request.session.get('koszyk', [])
    produkty = list(Produkt.objects.filter(pk__in=koszyk))

    if request.method == 'POST':
        formularz = ZamowienieForm(request.POST)

        if formularz.is_valid():
            dane = formularz.cleaned_data
            tresc = loader.get_template('sklep/zamowienie.txt').render(Context({'produkty': produkty, 'dane': dane}))

            send_mail('Potwierdzenie zakupu', tresc, settings.EMAIL_SKLEPU, [dane['email']])
            send_mail(u'Zamówienie', tresc, dane['email'], [settings.EMAIL_SKLEPU])

            del request.session['koszyk']

            return HttpResponseRedirect(reverse('sklep_koszyk'))
    else:
        formularz = ZamowienieForm()

    if koszyk:
        kontekst = {'koszyk': produkty, 'formularz': formularz}
    else:
        kontekst = {'koszyk': []}

    return direct_to_template(request, 'sklep/koszyk.html', extra_context = kontekst)

def koszyk_dodaj(request, id_produktu):
    koszyk = request.session.get('koszyk', [])
    if int(id_produktu) not in koszyk:
        koszyk.append(int(id_produktu))
    request.session['koszyk'] = koszyk
    return HttpResponseRedirect(reverse('sklep_koszyk'))

forms.py

# coding: utf-8
from django import forms
from django.contrib.localflavor.pl.forms import PLPostalCodeField

class ZamowienieForm(forms.Form):
    email = forms.EmailField()
    imie_nazwisko = forms.CharField(label=u'Imię i nazwisko', max_length=60)
    adres = forms.CharField(max_length=100)
    kod_pocztowy = PLPostalCodeField()
    miasto = forms.CharField(max_length=60)
    uwagi = forms.CharField(widget=forms.Textarea, required=False)

【问题讨论】:

    标签: python django csrf


    【解决方案1】:

    问题可能出在您的模板 sklep/koszyk.html 中。在 html 页面的表单中,您需要包含 {% csrf_token %}documentation 有关于此功能的更多信息。

    【讨论】:

      【解决方案2】:

      此外,要添加 murgatroid99 所说的内容,您需要在调用该页面时包含 csrf(request)。我通常做一个 locals().update(csrf(request)) 然后用 locals() 作为全局字典参数调用页面。

      【讨论】:

        【解决方案3】:

        对于 POST 请求,Django 需要一个 CSRF 令牌来防止Cross Site Request Forgeries。您可能必须在表单内的模板中包含{% csrf_token %}。如果您知道自己在做什么(例如 api 调用),您还可以使用 @csrf_exempt 装饰器。

        有关此问题的更多详细信息,请查看Django documentation about CSRF Protection

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-09
          • 1970-01-01
          • 2012-03-15
          • 2012-10-18
          • 2017-09-21
          • 2015-09-11
          • 2021-07-27
          相关资源
          最近更新 更多