【问题标题】:Django: Still getting CSRF error after trying tons of fixesDjango:尝试大量修复后仍然出现 CSRF 错误
【发布时间】:2011-08-25 04:04:34
【问题描述】:

我收到“CSRF 令牌丢失或不正确”。

我已经检查了 Stack Overflow 的答案,但没有任何效果;我仔细检查了我的消息来源,真的不知道我做错了什么。它仅在我用CsrfViewMiddleware 评论MIDDLEWARE_CLASSES 行时才有效,但我认为这是我永远不需要做的事情。

以下是我认为相关的代码:

settings.py

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

views.py

from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
from sitfin.models import Balanta, Conturi, BalantaForm, ConturiForm
from django.forms.formsets import formset_factory

def render_to_response(req,*args,**kwargs):
    kwargs['context_instance']=RequestContext(req)
    return render_to_response(*args,**kwargs)

def conturi_index(request):
    return render_to_response('sitfin/conturi_index.html',{'conturi_list':Conturi.objects.all()})

def conturi_introducere(request):
    ConturiFormSet=formset_factory(ConturiForm)
    if request.method=='POST':
        #form=ConturiForm(data=request.POST)
        formset=ConturiFormSet(request.POST, request.FILES)
        #if form.is_valid():
        if formset.is_valid():
            #new_entry=form.save()
            new_entry=formset.save()
            return HttpResponseRedirect("sitfin/conturiok")
    else:
        #form=ConturiForm()
        formset=ConturiFormSet()
    #return render_to_response('sitfin/conturi_introducere.html',{'form':form})
    return render_to_response('sitfin/conturi_introducere.html',{'formset':formset})

模板

<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">

    <title>Conturi_introducere</title>

</head>
<body>
    <p>BAGA CONTURILE</p>
    <form action="" method="post">{% csrf_token %}
        {{ formset.management_form }}
        <!--<p><label for="id_cont">cont:</label>{{ form.cont }}</p>
        <p><label for="id_cont_debit">cont debit:</label>{{ form.cont_debit }}</p>
        <p><label for="id_cont_credit">cont credit:</label>{{ form.cont_credit }}</p>
        -->
        <table border="0">
            {% for form in formset %}
            {{ form }}
            {% endfor %}
        </table>

    <p><input type="submit" value="Submit"></p>
    </form>
</body>
</html>

我做错了什么?

【问题讨论】:

  • CSRF 使用 cookie 进行验证。您在浏览器上启用了这些功能对吗?

标签: python django csrf


【解决方案1】:

您需要确保在响应中包含 RequestContext。

return render_to_response('sitfin/conturi_introducere.html',{'formset':formset},
context_instance=RequestContext(request))

【讨论】:

  • 谢谢你!有用!我认为views.py 中的render_to_response 包装器会解决这个问题:)
  • 很高兴听到这个消息。有时您不想在响应中自动包含上下文,因此拥有这种级别的控制通常是件好事。也就是说,我相信您可以使用 direct_to_template 通用视图,而不是 render_to_response,它会自动包含上下文。
【解决方案2】:

我也会删除

'django.middleware.csrf.CsrfResponseMiddleware',

这是遗留的,由于安全和性能问题正在被贬值。

Referece

【讨论】:

  • 我删除了那个。你是对的,请阅读已弃用。谢谢你。
猜你喜欢
  • 2021-07-08
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 2019-06-12
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
相关资源
最近更新 更多