首页 > 解决方案 > 登录期间导致 csrf_token 问题的 Django CustomMiddleware

问题描述

我一直在尝试实现这个逻辑:

每当用户注册并确认他的电子邮件时,他的帐户就处于活动状态。但是,为了让用户获得对网站的完全访问权限,他必须先输入一些关于他自己的数据。我称之为完整配置文件。

我认为制作中间件是实现逻辑的好方法。所以我写了以下内容:

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>

标签: django

解决方案


没有中间件一切正常吗?

您应该csrftoken在 期间发送POST request,可以使用 django 模板语言。您可以使用{% csrf_token %}模板标签。


推荐阅读