Django CustomMiddleware вызывает проблемы csrf_token во время входа - PullRequest
0 голосов
/ 19 мая 2019

Я пытался реализовать эту логику:

Когда пользователь регистрируется, подтверждает свою электронную почту, его учетная запись активна. Однако, чтобы дать пользователю полный доступ к веб-сайту, он должен сначала ввести некоторые данные о себе. Я называю это полным профилем.

Я подумал, что промежуточное ПО - это хороший способ реализовать логику. Поэтому я написал следующее:

class CompleteProfileMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)

        if request.path == "/account/" + request.user.username + '/complete-registration/':
            pass
        elif request.user.is_anonymous:
            pass
        elif request.user.is_superuser:
            pass
        elif request.user.student.complete_profile:
            pass
        elif not request.user.student.complete_profile:
            return redirect('/account/' + request.user.username + '/complete-registration/')

        # Code to be executed for each request/response after
        # the view is called.

        return response

Однако теперь, чтобы получить доступ ко всей странице профиля, люди должны сначала войти в систему. И во время входа в систему возникают проблемы с токеном csrf: Forbidden. CSRF verification failed. Request aborted.

Если я удаляю промежуточное ПО, все снова начинает работать, поэтому проблема должна быть здесь.

Вот шаблон входа:

    <div class="main">

        <section class="signup">
            <div class="container">
                <div class="row">
                <div class="signup-content col-sm-12">
                    <form id="signup-form" class="signup-form" method="post" action="{% url 'login' %}">
                        {% csrf_token %}
                        <h2 class="form-title">Log In</h2>
                            {{ form | crispy}}
                            <input type="submit" style="margin-top: 10px" value="Login" class="button" id="" />
                            <input type="hidden" name="next" value="{{ next }}" />
                    </form>
                    <div class="col-sm-12" style="text-align: right; margin-top: 5px">
                        <a href="{% url 'password_reset' %}">Forgot Password?</a>

                    </div>
                    <p class="loginhere">
                        New Here ? <a href="/account/register" class="loginhere-link">Create an account here</a>
                    </p>
                </div>
            </div>
                </div>
        </section>

    </div>

1 Ответ

0 голосов
/ 19 мая 2019

Без промежуточного программного обеспечения все работает нормально?

Вы должны отправить csrftoken во время POST request, это возможно с использованием языка шаблонов django.Вы можете использовать {% csrf_token %} шаблон тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...