Действие входа не работает в django, токен csrf отсутствует или запрещен
когда нажимается кнопка входа, она только обновляет страницу, но не выполняет функцию loginAction, даже я не могу вывести данные, которые я пишу в этой функции.
HTML страница
<form method="post" action="{% url 'loginAction' % }" enctype="multipart/form-data">
{% csrf_token %}
<div class="row">
<div class="col-lg-12">
<div class="row">
<div class="col-md-6 wow fadeInLeft" data-wow-duration="2s" data-wow-delay="600ms">
<div class="form-group">
<input type="email" class="form-control" placeholder="Your Email *" id="email" name="email"
required data-validation-required-message="Please enter your email address.">
<p class="help-block text-danger"></p>
</div>
<div class="form-group">
<input type="text" class="form-control" placeholder="password *" id="phone" name="phone"
required data-validation-required-message="Please enter your password.">
<p class="help-block text-danger"></p>
</div>
<div class="col-lg-12 text-center wow zoomIn" data-wow-duration="1s" data-wow-delay="600ms">
<button type="submit" class="btn btn-primary">login</button>
</div>
</div>
<div class="col-md-6 wow fadeInRight" data-wow-duration="2s" data-wow-delay="600ms">
<div class="form-group">
<img src="/static/asset/images/flickr/capture.jpg" height="330px" width="200px">
</div>
</div>
</div>
</div>
</div>
</form>
Функция входа в систему
def loginAction(request):
if request.method == 'POST':
#print("email")
email = request.POST["email"]
password = request.POST["password"]
user = register_tb.objects.filter(email=email, password=password)
if user.count()> 0:
return render('home.html',{'msg':"login success "})
else:
return render ("login.html",{'msg':"login failed "})
В ваш HTML включен CSRF-токен, поэтому он должен быть запрещен.
Документация была очень полезна для меня при изучении CSRF-токенов.
Это особенно то, что вы можете найти полезным.
В целях безопасности маркеры CSRF меняются каждый раз, когда пользователь входит в систему. Любая страница с формой, созданной до входа в систему, будет иметь старый, недействительный CSRF-токен и должна быть перезагружена. Это может произойти, если пользователь использует кнопку назад после входа в систему или если он входит в систему на другой вкладке браузера.
.
Убедитесь, что вы не вошли в систему или не создали форму входа в другой вкладке или окне, или не использовали кнопку "Назад" после входа.
Попробуйте добавить это к вашему представлению:
c = {}
c.update(csrf(request))
# ... view code here
return render_to_response("a_template.html", c)
В вашем случае это будет:
from django.core.context_processors import csrf
def loginAction(request):
if request.method == 'POST':
#print("email")
email = request.POST["email"]
password = request.POST["password"]
user = register_tb.objects.filter(email=email, password=password)
if user.count()> 0:
c = {'msg': "login success "}
c.update(csrf(request))
return render('home.html',c)
else:
c = {'msg': "login failed "}
c.update(csrf(request))
return render ("login.html",c)
Также убедитесь, что у вас 'django.middleware.csrf.CsrfViewMiddleware' в middleware_classes в settings.py.
Если ни один из вышеперечисленных методов не работает, попробуйте следующее для вашего представления:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def loginAction(request):
if request.method == 'POST':
#print("email")
email = request.POST["email"]
password = request.POST["password"]
user = register_tb.objects.filter(email=email, password=password)
if user.count()> 0:
return render('home.html',{'msg':"login success "})
else:
return render ("login.html",{'msg':"login failed "})
Обратите внимание, что CSRF Exempt делает ваш сайт уязвимым. Попробуйте следующее более безопасное решение:
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def loginAction(request):
if request.method == 'POST':
#print("email")
email = request.POST["email"]
password = request.POST["password"]
user = register_tb.objects.filter(email=email, password=password)
if user.count()> 0:
return render('home.html',{'msg':"login success "})
else:
return render ("login.html",{'msg':"login failed "})
Один из этих методов должен сработать для вас. Попробуйте все и свяжитесь со мной.