禁止(403)CSRF验证失败。请求中止.in姜

2024-05-08 15:03:14 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么Django显示这个错误:“禁止(403)CSRF验证失败。请求被中止。当我已经在表单中有{% csrf_token %}时。在

templates/core/signup.html

{% block content %}
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Sign up</button>
    </form>
{% endblock %}

views.py

^{pr2}$

Tags: djangocoreformtoken表单html错误button
2条回答

在你的视图.py您需要在您的render_to_response中传递RequestContext,以便实际运行上下文处理器。在

from django.template import RequestContext

 context = {}
 return render_to_response('my_template.html',
                           context,
                           context_instance=RequestContext(request))

新的渲染快捷方式(django 1.3+)将为您提供:

^{pr2}$

对于class-based view

class MyFormView(View):
     form_class = MyForm
     initial = {'key': 'value'}
     template_name = 'form_template.html'

     def post(self, request, *args, **kwargs):
         form = self.form_class(request.POST)
         if form.is_valid():
             # <process form cleaned data>
             return HttpResponseRedirect('/success/')

         return render(request, self.template_name, {'form': form})

因为你已经从django.core.context_处理器.csrf发送给上下文管理器。检查表单HTML是否有这样的内容:

<input type='hidden' name='csrfmiddlewaretoken' value="jqhdwjavwjagjzbefjwdjqlkkop2j3ofje" />

要使csrf保护起作用,还需要一些其他的东西(查看docs):

  • 浏览器必须接受来自服务器的cookies

  • 确保你有django.middleware.csrf.CsrfViewMiddleware'作为中间件包含在设置.py(或者对要保护的特定视图使用装饰器csrf_protect())

相关问题 更多 >