#python #django #csrf
#python #django #csrf
Вопрос:
Я получаю «токен CSRF отсутствует или неверен».
Я уже проверил Stack Overflow для ответа, и ничего не сработало; Я дважды проверил свои источники и действительно не знаю, что я сделал не так. Это работает только тогда, когда я комментирую MIDDLEWARE_CLASSES
строку с помощью CsrfViewMiddleware
, но я думаю, что это то, что мне никогда не нужно делать.
Вот фрагменты кода, которые, на мой взгляд, актуальны:
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>
Что я делаю не так?
Комментарии:
1. CSRF проверяется с помощью файлов cookie. Они у вас включены в вашем браузере, верно?
Ответ №1:
Вам нужно убедиться, что вы включили RequestContext в свой ответ.
return render_to_response('sitfin/conturi_introducere.html',{'formset':formset},
context_instance=RequestContext(request))
Комментарии:
1. Спасибо, чувак! Это работает! Я думал, что оболочка render_to_response в views.py позаботился бы об этом 🙂
2. Рад это слышать. Бывают случаи, когда вы не хотите автоматически включать контекст в ответ, поэтому, как правило, хорошо иметь такой уровень контроля. Тем не менее, я полагаю, что вы можете использовать общий вид direct_to_template вместо render_to_response, который автоматически включит контекст.
Ответ №2:
Также я бы удалил
'django.middleware.csrf.CsrfResponseMiddleware',
Это устаревшее решение, которое обесценивается из-за проблем с безопасностью и производительностью.
Комментарии:
1. Я удалил это. Вы правы, o прочитайте, что это устарело. Спасибо вам.