Я пытался реализовать эту логику:
Когда пользователь регистрируется, подтверждает свою электронную почту, его учетная запись активна. Однако, чтобы дать пользователю полный доступ к веб-сайту, он должен сначала ввести некоторые данные о себе. Я называю это полным профилем.
Я подумал, что промежуточное ПО - это хороший способ реализовать логику. Поэтому я написал следующее:
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>