ik probeer in te loggen in django, maar ik krijg deze foutmelding, ik controleer de CSRF-documentatie en niets werkt voor mij.
Hier is de HTML:
<body>
<section class="container">
<div class="login">
<h1>Login to Web App</h1>
{% if form.errors %}
<p class="error">Lo sentimos, la combinacion de usuario y contrasena no es correcta!</p>
{% endif %}
<form action="/accounts/auth/" method="post">
{% csrf_token %}
<input type='hidden' name='csrfmiddlewaretoken' value='randomchars'/>
<p><input name="username" type="text" name="login" value="" placeholder="Username"></p>
<p><input name="password" type="password" name="password" value="" placeholder="Password"></p>
<p class="submit"><input type="submit" name="commit" value="Login"></p>
</form>
</div>
</body>
Zoals je hierboven ziet, gebruik ik de {% csrf_token %} en heb ik ‘django.middleware.csrf.CsrfViewMiddleware’ in mijn geïnstalleerde apps.
En mijn mening is:
from django.http import HttpResponse,HttpResponseRedirect
from django.template.loader import get_template
from django.template import Context
from datetime import datetime
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.contrib import auth
from django.core.context_processors import csrf
from models import *
from django.shortcuts import get_object_or_404
from forms import *
from django.template.context import RequestContext
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login
def login(request):
c = {}
c.update(csrf(request))
return render_to_response('login.html', c)
def auth_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
auth.login(request.user)
return HttpResponse('/accounts/loggedin')
else:
return HttpResponse('/accounts/invalid')
ik stuur om naar een ander HTML-bestand waar ik de {% csrf_token %} niet gebruik.
Antwoord 1, autoriteit 100%
Theorie
Er zijn een aantal dingen vereist om de csrf-beveiliging te laten werken (bekijk de docs ):
- Uw browser moet cookies van uw server accepteren
- Zorg ervoor dat je ‘
django.middleware.csrf.CsrfViewMiddleware'
als middleware hebt opgenomen in jesettings.py
(of gebruik de decorateur csrf_protect() voor bepaalde weergaven die je wil beschermen) - Zorg ervoor dat u het csrf-token van
django.core.context_processors.csrf
doorgeeft aan de contextmanager.
Als je je pagina laadt, kijk dan in de paginabron met je favoriete browser. Open niet het sjabloon html-bestand, open de url die verwijst naar de weergave die het formulier bevat. Kijk waar je de {% csrf_token %}
hebt geplaatst. Als je iets ziet als
<input type='hidden' name='csrfmiddlewaretoken' value="jdwjwjefjwdjqwolksqowkop2j3ofje" />
het zou goed moeten komen.
Als je daarentegen NOTPROVIDED
ziet, is er iets misgegaan bij het maken van het csrf-token. Door in de broncode te kijken (context_processors.py
en csrf.py
), kunnen we achterhalen wat:
csrf(request)
retourneert{'csrf_token': 'NOTPROVIDED'}
alsget_token(request)
Geen retourneert.get_token(request)
retourneertrequest.META.get("CSRF_COOKIE", None)
.
Ik neem aan dat dit betekent dat het None
retourneert als de cookie niet succesvol is gemaakt.
Oplossen
Voor jou betekent dit dat je eerst moet vervangen
<form action="/accounts/auth/" method="post" {% csrf_token %}>
met
<form action="/accounts/auth/" method="post">
{% csrf_token %}
(...)
</form>
We willen dat het csrf-veld zich in <form>...</form>
bevindt, niet in <form>
. Zoals de code op dit moment is, wordt deze geconverteerd naar
<form action="/accounts/auth/" method="post" <input type='hidden' name='csrfmiddlewaretoken' value='randomchars' />>
en we willen liever
<form action="/accounts/auth/" method="post">
<input type='hidden' name='csrfmiddlewaretoken' value='randomchars' />
Daarna – bekijk de broncode en kijk of je het csrf-veld kunt vinden. Als je het kunt zien, zou alles in theorie moeten werken.
U kunt ook controleren of de csrf-cookie in uw browser is ingesteld, b.v. Klik in Chrome met de rechtermuisknop op de webpagina en selecteer Insepect Element
. Selecteer het tabblad Resources
en klik op cookies. Je zou daar een cookienaam csrftoken
moeten vinden.
Als u nog steeds problemen ondervindt, controleer dan de middleware-tuple in uw settings.py
en controleer nogmaals of uw browser cookies van uw server accepteert zoals hierboven beschreven.
Antwoord 2, autoriteit 11%
Wis uw browsercache en probeer het opnieuw. Misschien gebruikt het de CSRF-token die is opgeslagen in de cache-cookie.
Antwoord 3
Met toevoeging van het bovenstaande antwoord, probeer de volgende regels toe te voegen in de weergaven
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def somathing():
return something