Eu tenho alguns problemas por um tempo agora, estou enfrentando CSRF Cookie not set. Por favor, olhe os códigos abaixo
Pitão
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))
No HTML aqui está o código
HTML
<form action="/deposit/{{ account_num }}/" method="post">
<table>
<tr>
{{ account_form.bal_change }}
<input type="submit" value="Deposit"/>
</tr>
{% csrf_token %}
</table>
</form>
Estou preso, já limpei o cookie, usei outro navegador, mas ainda o cookie csrf não foi definido.
CsrfViewMiddleware
em suaMIDDLEWARE_CLASSES
configuração?{%csrf_token%}
em seu formulário no modelo.credentials: 'include'
à solicitação POST e, em seguida, TAMBÉM adicionar no settings.py: do djangoCORS_ALLOW_CREDENTIALS = True
parece ter corrigido o problema sem a necessidade de adicionar@csrf_exempt
à visualização. Na verdade, está nos documentos ... pypi.org/project/django-cors-headers-multi * Eu sei que isso se relaciona a uma das perguntas acima, mas não posso comentar ainda e espero poupar o tempo de outra pessoa me levou para encontrar tRespostas:
Isso também pode ocorrer se
CSRF_COOKIE_SECURE = True
estiver definido e você estiver acessando o site de forma não segura ou seCSRF_COOKIE_HTTPONLY = True
estiver definido como indicado aqui e aquifonte
SESSION_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")
fonte
Se você estiver usando a API HTML5 Fetch para fazer solicitações POST como um usuário conectado e obtendo
Forbidden (CSRF cookie not set.)
, pode ser porque, por padrãofetch
não inclui cookies de sessão, fazendo com que o Django pense que você é um usuário diferente daquele que carregou a página .Você pode incluir o token de sessão passando a opção
credentials: 'include'
de buscar:var csrftoken = getCookie('csrftoken'); var headers = new Headers(); headers.append('X-CSRFToken', csrftoken); fetch('/api/upload', { method: 'POST', body: payload, headers: headers, credentials: 'include' })
fonte
Headers
é uma interface global de javascript, parte da API HTML5 Fetch. developer.mozilla.org/en-US/docs/Web/API/HeadersDe Este Você pode resolvê-lo adicionando o decorador ensure_csrf_cookie a sua visão
from django.views.decorators.csrf import ensure_csrf_cookie @ensure_csrf_cookie def yourView(request): #...
se este método não funcionar. você tentará comentar o csrf no middleware. e teste novamente.
fonte
Eu me deparei com uma situação semelhante ao trabalhar com o DRF, a solução foi anexar o método .as_view () ao modo de exibição em urls.py
fonte
.as_view()
aftrer meu ApiView para que a aparência do código:urlpatterns += path('resource', ResourceView)
E é assim que deveria ser:urlpatterns += path('resource', ResourceView.as_view())
Se você estiver usando DRF, verifique se seus padrões de URL estão corretos, talvez você tenha esquecido
.as_view()
:Assim era como o meu código parecia:
urlpatterns += path('resource', ResourceView)
E é assim que deve ser:
urlpatterns += path('resource', ResourceView.as_view())
fonte
tente verificar se você instalou no settings.py
MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',)
No modelo, os dados são formatados com o csrf_token:
fonte
Este problema surgiu recentemente devido a um bug no próprio Python.
http://bugs.python.org/issue22931
https://code.djangoproject.com/ticket/24280
Entre as versões afetadas estavam 2.7.8 e 2.7.9. O cookie não foi lido corretamente se um dos valores continha um
[
caractere.Atualizar o Python (2.7.10) corrige o problema.
fonte
Isso também ocorre quando você não define a ação do formulário.
Para mim, estava mostrando este erro quando o código era:
<form class="navbar-form form-inline my-2 my-lg-0" role="search" method="post">
Quando eu corrigi meu código neste:
<form class="navbar-form form-inline my-2 my-lg-0" action="{% url 'someurl' %}" role="search" method="post">
meu erro desapareceu.
fonte
O problema parece que você não está lidando com as
GET
solicitações de forma adequada ou postando os dados diretamente sem primeiro obter o formulário.Ao acessar a página pela primeira vez, o cliente enviará a
GET
solicitação, nesse caso deverá enviar html com formulário apropriado.Mais tarde, o usuário preenche o formulário e envia
POST
solicitação com os dados do formulário.Sua visão deve ser:
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))
fonte
Verifique se os cookies do Chrome estão configurados com a opção padrão para sites. Permitir que dados locais sejam definidos (recomendado).
fonte
Método 1:
from django.shortcuts import render_to_response return render_to_response( 'history.html', RequestContext(request, { 'account_form': form, })
Método 2:
from django.shortcuts import render return render(request, 'history.html', { 'account_form': form, })
Porque o método render_to_response pode causar alguns problemas de cookies de resposta.
fonte
Acabei de me encontrar uma vez, a solução é esvaziar os biscoitos. E pode ser alterado durante a depuração de SECRET_KEY relacionado.
fonte
Limpar o cache do meu navegador corrigiu esse problema para mim. Eu estava alternando entre ambientes de desenvolvimento local para fazer o tutorial django-blog-zinnia depois de trabalhar em outro projeto quando isso aconteceu. A princípio, pensei que mudar a ordem do INSTALLED_APPS para coincidir com o tutorial tinha causado isso, mas eu os coloquei de volta e não consegui corrigi-lo até limpar o cache.
fonte
Eu estava usando Django 1.10 antes. Portanto, estava enfrentando esse problema. Agora fiz o downgrade para Django 1.9 e está funcionando bem.
fonte
Eu tive o mesmo erro, no meu caso adicionar method_decorator ajuda:
from django.views.decorators.csrf import csrf_protect from django.utils.decorators import method_decorator method_decorator(csrf_protect) def post(self, request): ...
fonte
Certifique-se de que o back-end da sessão django está configurado corretamente em settings.py. Então tente isso,
class CustomMiddleware(object): def process_request(self,request:HttpRequest): get_token(request)
Adicione este middleware em
settings.py
sobMIDDLEWARE_CLASSES
ouMIDDLEWARE
dependendo da versão do djangoget_token - Retorna o token CSRF necessário para um formulário POST. O token é um valor alfanumérico. Um novo token é criado, se ainda não houver um definido.
fonte
Na sua opinião, você está usando o decorador csrf ??
from django.views.decorators.csrf import csrf_protect
@csrf_protect def view(request, params): ....
fonte