Джанго ключ CSRF cookie не установлен
у меня есть некоторые проблемы на некоторое время, я испытываю CSRF Cookie не установлен. Пожалуйста, посмотрите на коды ниже
Python
def deposit(request,account_num):
if request.method == 'POST':
account = get_object_or_404(account_info,acct_number=account_num)
form_=AccountForm(request.POST or None, instance=account)
form = BalanceForm(request.POST)
info = str(account_info.objects.filter(acct_number=account_num))
inf=info.split()
if form.is_valid():
#cd=form.cleaned_data
now = datetime.datetime.now()
cmodel = form.save()
cmodel.acct_number=account_num
#RepresentsInt(cmodel.acct_number)
cmodel.bal_change="%0.2f" % float(cmodel.bal_change)
cmodel.total_balance="%0.2f" %(float(inf[1]) + float(cmodel.bal_change))
account.balance="%0.2f" % float(cmodel.total_balance)
cmodel.total_balance="%0.2f" % float(cmodel.total_balance)
#cmodel.bal_change=cmodel.bal_change
cmodel.issued=now.strftime("%m/%d/%y %I:%M:%S %p")
account.recent_change=cmodel.issued
cmodel.save()
account.save()
return HttpResponseRedirect("/history/" + account_num + "/")
else:
return render_to_response('history.html',
{'account_form': form},
context_instance=RequestContext(request))
в HTML вот код
HTML-код
<form action="/deposit/{{ account_num }}/" method="post">
<table>
<tr>
{{ account_form.bal_change }}
<input type="submit" value="Deposit" />
</tr>
{% csrf_token %}
</table>
</form>
Im застрял, я уже очистил cookie, использовал другой браузер, но все равно CSRF cookie не установлен.
16 ответов
Это также может произойти, если CSRF_COOKIE_SECURE = True
установлен, и вы получаете доступ к сайту небезопасно.
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def your_view(request):
if request.method == "POST":
# do something
return HttpResponse("Your response")
если вы используете HTML5 Fetch API чтобы сделать запросы POST в качестве зарегистрированного пользователя и получить Forbidden (CSRF cookie not set.)
, это может быть потому, что по умолчанию fetch
не включает сеансовые куки, в результате чего Django думает, что вы другой пользователь, чем тот, кто загрузил страницу.
вы можете включить токен сеанса, передав опцию credentials: 'include'
принести:
var csrftoken = getCookie('csrftoken');
var headers = new Headers();
headers.append('X-CSRFToken', csrftoken);
fetch('/api/upload', {
method: 'POST',
body: payload,
headers: headers,
credentials: 'include'
})
С этой Вы можете решить его, добавив ensure_csrf_cookie оформителя на ваш взгляд
from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
#...
если этот метод не работает. вы попытаетесь прокомментировать csrf в промежуточном по. и снова проверить.
эта проблема возникла снова недавно из-за ошибки в самом Python.
http://bugs.python.org/issue22931
https://code.djangoproject.com/ticket/24280
среди затронутых версий были 2.7.8 и 2.7.9.
Файл cookie не был прочитан правильно, если одно из значений содержало [
символ.
обновление Python (2.7.10) устраняет проблему.
раньше я использовал Django 1.10.Поэтому я столкнулся с этой проблемой. Теперь я понизил его до Django 1.9, и он работает нормально.
Я столкнулся с аналогичной ситуацией во время работы с DRF, решение было добавлено .метод as_view() для представления в urls.py
попробуйте проверить, установлены ли ваши settings.py
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',)
в шаблоне данные форматируются с помощью csrf_token:
<form>{% csrf_token %}
</form>
проблема, кажется, что вы не обращение GET
запрашивает соответствующую или прямую публикацию данных без предварительного получения формы.
при первом доступе к странице клиент отправит GET
запрос, в этом случае вы должны отправить html с соответствующей формой.
позже, пользователь заполняет форму и отправляет POST
запрос с данными форм.
ваш взгляд должен быть:
def deposit(request,account_num):
if request.method == 'POST':
form_=AccountForm(request.POST or None, instance=account)
if form.is_valid():
#handle form data
return HttpResponseRedirect("/history/" + account_num + "/")
else:
#handle when form not valid
else:
#handle when request is GET (or not POST)
form_=AccountForm(instance=account)
return render_to_response('history.html',
{'account_form': form},
context_instance=RequestContext(request))
убедитесь, что файлы cookie chrome установлены по умолчанию для веб-сайтов. Разрешить установку локальных данных (рекомендуется).
Способ 1:
from django.shortcuts import render_to_response
return render_to_response(
'history.html',
RequestContext(request, {
'account_form': form,
})
Способ 2 :
from django.shortcuts import render
return render(request, 'history.html', {
'account_form': form,
})
потому что метод render_to_response может возникнуть некоторая проблема с ответом cookies.
убедитесь, что ваш сервер сеанса django настроен правильно в settings.py - ... Тогда попробуйте это,
class CustomMiddleware(object):
def process_request(self,request:HttpRequest):
get_token(request)
добавьте это промежуточное ПО в settings.py
под MIDDLEWARE_CLASSES или MIDDLEWARE в зависимости от версии django
get_token-возвращает токен CSRF, необходимый для формы POST. Маркер является буквенно-цифровым значением. Новый токен создается, если он еще не установлен.
У меня была такая же ошибка, в моем случае добавление method_decorator помогает:
from django.views.decorators.csrf import csrf_protect
from django.utils.decorators import method_decorator
method_decorator(csrf_protect)
def post(self, request):
...
Я только однажды встретил решение очистить куки. И может быть изменен при отладке SECRET_KEY связанных.
очистить кэш моего браузера исправила эту проблему для меня. Я переключался между локальными средами разработки, чтобы сделать учебник django-blog-zinnia после работы над другим проектом, когда это произошло. Сначала я думал, что изменение порядка INSTALLED_APPS в соответствии с учебником вызвало его, но я установил их обратно и не смог исправить его до очистки кэша.
на ваш взгляд, вы используете декоратор csrf??
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def view(request, params):
....