Подтвердить что ты не робот

Печенье Django CSRF не установлено

У меня есть некоторая проблема в течение некоторого времени, я испытываю 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 }}
&nbsp;
<input type="submit" value="Deposit" />
</tr>
{% csrf_token %}
</table>
</form>

Я застрял, я уже очистил файл cookie, использовал другой браузер, но все же csrf cookie не установлен.

4b9b3361

Ответ 1

Это также может произойти, если установлено CSRF_COOKIE_SECURE = True и вы небезопасно заходите на сайт, или если CSRF_COOKIE_HTTPONLY = True установлено так, как указано здесь и здесь

Ответ 2

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")

Ответ 3

Если вы используете API HTML Fetch API, чтобы сделать запросы POST зарегистрированным пользователем и получить Forbidden (CSRF cookie not set.), это может быть связано с тем, что по умолчанию fetch не включает файлы cookie сеанса, в результате чего 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'
})

Ответ 4

Исходя из этого, вы можете решить эту проблему, добавив к вашему виду декоратор sure_csrf_cookie

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
 #...

если этот метод не работает Вы попытаетесь прокомментировать csrf в промежуточном программном обеспечении. и проверить снова.

Ответ 5

Я столкнулся с подобной ситуацией, работая с DRF, решение добавляло метод.as_view() к представлению в urls.py.

Ответ 6

Эта проблема возникла недавно из-за ошибки в самом Python.

http://bugs.python.org/issue22931

https://code.djangoproject.com/ticket/24280

Среди затронутых версий были 2.7.8 и 2.7.9. Файл cookie не был правильно прочитан, если одно из значений содержало символ [.

Обновление Python (2.7.10) устраняет проблему.

Ответ 7

Я использовал Django 1.10 раньше. Так что я столкнулся с этой проблемой. Теперь я понизил его до Django 1.9, и он отлично работает.

Ответ 8

Это также происходит, когда вы не задаете действие формы.
Для меня это показывало эту ошибку, когда код был:

<form class="navbar-form form-inline my-2 my-lg-0" role="search" method="post">

Когда я исправил свой код в это:

<form class="navbar-form form-inline my-2 my-lg-0" action="{% url 'someurl' %}" role="search" method="post">

моя ошибка исчезла.

Ответ 9

попробуйте проверить, установлены ли в settings.py

 MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',)

В шаблоне данные форматируются с помощью csrf_token:

<form>{% csrf_token %}
</form>

Ответ 10

Проблема в том, что вы не обрабатываете запросы 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))

Ответ 11

Убедитесь, что хром-куки установлены с настройками по умолчанию для веб-сайтов. Разрешить локальные данные (рекомендуется).

Ответ 12

Способ 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 может иметь некоторую проблему с куки-ответами.

Ответ 13

Убедитесь, что ваш бэкэнд сессии 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. Маркер является буквенно-цифровым значением. Новый токен создается, если он еще не установлен.

Ответ 14

У меня была такая же ошибка, в моем случае добавление метода 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):
    ...

Ответ 15

Я только что встречался один раз, решение состоит в том, чтобы очистить файлы cookie. И может быть изменен при отладке SECRET_KEY.

Ответ 16

Очистка кеша браузера исправила эту проблему для меня. Я переключался между локальными средами разработки, чтобы сделать учебник django-blog-zinnia после работы над другим проектом, когда это произошло. Сначала я решил изменить порядок INSTALLED_APPS в соответствии с тем, что вызвало его урок, но я установил их и не смог исправить его до очистки кеша.

Ответ 17

На ваш взгляд, вы используете декоратор csrf??

from django.views.decorators.csrf import csrf_protect

@csrf_protect def view(request, params): ....