【问题标题】:"CSRF token missing or incorrect"“CSRF 令牌丢失或不正确”
【发布时间】:2014-03-29 23:27:01
【问题描述】:

编辑已解决:我觉得自己像个白痴。我最初创建了两个单独的视图:一个用于输入,一个用于输出。我一直在输出视图中处理所有代码,即使我重新排列了我的 url 和模板以仅重用输入视图......对不起大家。现在可以正常使用了...


我在本地主机上运行,​​当我提交表单时,我收到“CSRF 令牌丢失”错误。我已经阅读了文档和一些 stackoverflows。我已经解决了大部分常见问题:

  • 我的模板中有 csrf 令牌(加载模板时插入的正是这个:<input type="hidden" name="csrfmiddlewaretoken" value="">
  • 我正在使用带有 render_to_response('_template_',{_data_:'_data_'},context_instance=RequestContext(request)) 的 render_to_response
  • 我确实已将 RequestContext 导入到我的视图中
  • 我的设置中有'django.middleware.csrf.CsrfViewMiddleware'

有人知道我可能会错过什么吗?

这是我的表格:

<form action="" method="post">
            {% csrf_token %}
            <input type="text" name="q">
            <input type="submit" value = "Submit">
        </form>

这是我的看法:

def view_workout(request):
    errors = []
    if request.method == 'POST':
        q = request.POST['q']
        if not request.POST.get('q', ''):
            errors.append('Please complete all required fields')
            return render_to_response('swimsets/view_workout.html',{
                'error': errors
            },context_instance=RequestContext(request))
        else:
            return render_to_response('swimsets/view_workout.html',{
                'query': q
            },context_instance=RequestContext(request))

    else:

        return render_to_response('swimsets/view_workout.html', {

    },context_instance=RequestContext(request))

这是我的设置:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

【问题讨论】:

  • 我刚刚添加了它,删除了views.pyc,重新启动了本地主机。还是不行。
  • 我不禁觉得csrfmiddlewaretoken的值不应该是""。你能试着把{{ csrf_token }}(注意双括号,不是百分号)放在某个地方,并确保它显示一个真实的令牌吗?

标签: python django csrf


【解决方案1】:

根据相关问题 Is the {% csrf_token %} CSRF protection tag still necessary in Django 1.2? 中的回答,您可能缺少 CsrfResponseMiddleware

【讨论】:

  • 我尝试将其添加到中间件设置中,'django.middleware.csrf.CsrfResponseMiddleware',但随后服务器甚至无法运行...
  • 嗯,这个答案似乎已经很老了,而且那个中间件可能已经不存在了。
【解决方案2】:

您可能还需要将 csrf 导入到您的视图中:

from django.core.context_processors import csrf

【讨论】:

  • 我刚刚添加了它,删除了views.pyc,重新启动了本地主机。还是不行
  • 您可以只使用视图装饰器:CSRF Decorator 否则我可能会尝试清除您的浏览器数据。
  • 我尝试清除 .pyc、浏览器数据,并在视图上方添加了一个 @csrf_protect 以及导入 csrf_protect,但我仍然看到 403 错误。
猜你喜欢
  • 2021-07-14
  • 2011-12-26
  • 1970-01-01
  • 2014-12-25
  • 2014-02-26
  • 2021-10-01
  • 2021-11-13
  • 2012-04-20
  • 2012-09-25
相关资源
最近更新 更多