it-swarm.com.de

Django CSRF-Cookie nicht gesetzt

Ich habe seit einiger Zeit Probleme, ich habe kein CSRF-Cookie gesetzt. Bitte schauen Sie sich die Codes unten an

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

Im HTML ist hier der Code

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>

Ich bin festgefahren, ich habe den Cookie bereits gelöscht, einen anderen Browser verwendet, aber noch kein Csrf-Cookie gesetzt.

54
user2389182

Dies kann auch auftreten, wenn CSRF_COOKIE_SECURE = True eingestellt ist und Sie nicht sicher auf die Site zugreifen.

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

Wenn Sie die HTML5 Fetch API verwenden, um POST -Anfragen als angemeldeter Benutzer abzugeben und Forbidden (CSRF cookie not set.) zu erhalten, kann dies daran liegen, dass fetch standardmäßig keine Sitzungscookies enthält ein anderer Benutzer als der, der die Seite geladen hat.

Sie können das Sitzungstoken einschließen, indem Sie die Option credentials: 'include' übergeben, um Folgendes zu holen:

var csrftoken = getCookie('csrftoken');
var headers = new Headers();
headers.append('X-CSRFToken', csrftoken);
fetch('/api/upload', {
    method: 'POST',
    body: payload,
    headers: headers,
    credentials: 'include'
})
13
user85461

Von This Sie können das Problem lösen, indem Sie den sich_csrf_cookie -Dekorator Ihrer Ansicht hinzufügen

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

wenn diese Methode nicht funktioniert. Sie werden versuchen, csrf in der Middleware zu kommentieren. und nochmal testen.

7
dscanon

Bei der Arbeit mit DRF bin ich auf eine ähnliche Situation gestoßen. Die Lösung hängte die .as_view () - Methode an die View in urls.py an

2
Pratik Mhatre

Dieses Problem ist in letzter Zeit aufgrund eines Fehlers in Python selbst erneut aufgetreten.

http://bugs.python.org/issue22931

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

Unter den betroffenen Versionen waren 2.7.8 und 2.7.9. Das Cookie wurde nicht richtig gelesen, wenn einer der Werte ein [-Zeichen enthielt.

Durch die Aktualisierung von Python (2.7.10) wird das Problem behoben.

1
sbaechler

Ich habe früher Django 1.10 verwendet. Also stand ich vor diesem Problem ... Jetzt habe ich es auf Django 1.9 heruntergestuft und es funktioniert gut.

1
indspecter

Dies geschieht auch, wenn Sie die Formularaktion nicht festlegen.
Für mich zeigte es diesen Fehler, wenn der Code: 

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

Wenn ich meinen Code so korrigiert habe:

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

mein Fehler ist verschwunden.

1
Gokul Yesudoss

Stellen Sie sicher, dass Ihr Django-Sitzungs-Backend in settings.py ordnungsgemäß konfiguriert ist. Dann probieren Sie das aus,

class CustomMiddleware(object): def process_request(self,request:HttpRequest): get_token(request)

Fügen Sie diese Middleware in settings.py unter MIDDLEWARE_CLASSES oder MIDDLEWARE hinzu, abhängig von der Django-Version

get_token - Gibt das für ein Formular POST erforderliche CSRF-Token zurück. Das Token ist ein alphanumerischer Wert. Ein neues Token wird erstellt, wenn noch kein Token vorhanden ist.

0
arp

Methode 1:

from Django.shortcuts import render_to_response
return render_to_response(
    'history.html',
    RequestContext(request, {
        'account_form': form,
    })

Methode 2:

from Django.shortcuts import render
return render(request, 'history.html', {
    'account_form': form,
})

Weil die render_to_response-Methode Probleme mit Antwort-Cookies verursachen kann. 

0
shenqi0920

Das Problem scheint, dass Sie GET-Anforderungen nicht ordnungsgemäß bearbeiten oder die Daten direkt buchen, ohne das Formular abrufen zu müssen. 

Wenn Sie zum ersten Mal auf die Seite zugreifen, sendet der Client eine GET-Anforderung. In diesem Fall sollten Sie HTML mit dem entsprechenden Formular senden.

Später füllt der Benutzer das Formular aus und sendet eine POST-Anforderung mit den Formulardaten.

Ihre Sicht sollte sein:

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))
0
Rohan

versuchen Sie zu prüfen, ob Sie die Einstellungen in "settings.py" installiert haben

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

In der Vorlage werden die Daten mit dem csrf_token formatiert:

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

Ich hatte den gleichen Fehler, in meinem Fall hilft das Hinzufügen von 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):
    ...
0
moszoro

Überprüfen Sie, ob die Cookies von Chrome mit der Standardoption für Websites festgelegt sind. Erlauben, lokale Daten festzulegen (empfohlen).

0
IWS