【问题标题】:Django CSRF Failure After Upgrade 1.9 > 1.11升级 1.9 > 1.11 后 Django CSRF 失败
【发布时间】:2017-12-02 01:08:40
【问题描述】:

我刚刚将我正在开发的应用程序从 1.9 升级到 1.11,并且在所有表单帖子中不断出现错误:

CSRF token missing or incorrect.

所有 CSRF 令牌在 1.9 中都可以正常工作。这是视图:

def contact(request):
    subject = request.GET.get('subject', '')
    contact_form = forms.ContactForm(subject=subject)

    if request.POST:
        contact_form = forms.ContactForm(request.POST)

        if contact_form.is_valid():
            new_contact = contact_form.save()
            logic.send_contact_message(new_contact, request)
            messages.add_message(request, messages.SUCCESS, 'Your message has been sent.')
            return redirect(reverse('contact'))

    template = 'journal/contact.html'
    context = {
        'contact_form': contact_form,
        'contacts': core_models.Contacts.objects.filter(content_type=request.content_type,
                                                    object_id=request.site_type.pk)
    }

    return render(request, template, context)

这是模板:

            <h4>{% trans "Contact" %}</h4>
            <form method="POST">
                {% include "elements/forms/errors.html" with form=contact_form %}
                {% csrf_token %}
                <label for="id_recipient">{% trans "Who would you like to contact?" %}</label>
                <select id="id_recipient" name="recipient">
                    {% for contact in contacts %}<option value="{{ contact.email }}">{{ contact.name }}, {{ contact.role }}</option>{% endfor %}
                </select>
                {{ contact_form.sender|foundation }}
                {{ contact_form.subject|foundation }}
                {{ contact_form.body|foundation }}
                {{ contact_form.are_you_a_robot|foundation }}
                <button type="submit" class="success button">{% trans "Send Message" %}</button>
            </form>

【问题讨论】:

    标签: django csrf


    【解决方案1】:

    Django 1.10 introduced salted CSRF tokens that change every time the user logs in:

    在 Django 1.10 中更改:

    为令牌添加了加盐,并开始随每个请求更改它以防止BREACH 攻击。

    您必须注销并重新登录以生成新的加盐令牌,您的表单才能正常工作。

    Melvyn 建议在评论中清除您的会话存储。这也可以,如果您有很多用户,这可能是一个更好的选择。

    您可能还需要修改中间件设置以反映 the new style introduced in Django 1.10old MIDDLEWARE_CLASSES setting is deprecated 支持 MIDDLEWARE。确保'django.middleware.csrf.CsrfViewMiddleware' 包含在您的MIDDLEWARE 中。如果您有自定义中间件(或者如果您正在使用使用旧式中间件的库),则必须对其进行更新。

    【讨论】:

    • 或者清除会话存储(这将注销所有用户)。痛苦,但必要。
    • 好点,@Melvyn。如果有很多用户,那肯定会更好。谢谢!
    • 感谢您,清除了会话表并清除了浏览器 cookie,但尝试登录时仍然出现 CSRF 错误...
    • @ajrbyers,您是尝试通过标准管理员登录页面登录,还是有自定义登录页面?如果是后者,你试过前者吗?
    • @Chris 谢谢,我已经尝试过登录页面和其他各种不需要登录的帖子,但无济于事。中间件中的某些东西会破坏它吗?
    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 2016-11-18
    • 1970-01-01
    • 2016-05-29
    • 2019-04-13
    • 2018-01-12
    • 2015-08-04
    相关资源
    最近更新 更多