Действие входа не работает в 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 "})

Один из этих методов должен сработать для вас. Попробуйте все и свяжитесь со мной.

Вернуться на верх