zoukankan      html  css  js  c++  java
  • flask-login中加载用户函数的调用过程

    问题:

    **学习flask-login中,许多教程都说需要定义这个函数,但是都没有说清楚这个函数什么时候被调用所以请问

    1.load_user函数什么时候被调用了
    2.为什么需要填写load_user函数,具体到底是做什么的

    @login_manager.user_loader
    def load_user(user_id):
        """加载用户的函数"""
        return User.query.get(int(user_id))

    解答:

    要了解load_user的作用,先来看一下flask-login 是怎么工作的:

    @admin.rotue('/')
    @login_required
    def index():
        return render_template('index.html')

    当我们访问/admin时,flask-login会检查是否登录没有登录时会跳转到登录页,其实现在装饰器内部,源码也很简单,可以去看看。当跳转到登录页时,提交完表单之后要调用login_user函数:

    login_user(user,remember=form.remember_me.data)

    在login_user函数内部:

     user_id = getattr(user, current_app.login_manager.id_attribute)()
        session['user_id'] = user_id
        session['_fresh'] = fresh
        session['_id'] = _create_identifier()
    
        if remember:
            session['remember'] = 'set'
    
        _request_ctx_stack.top.user = user
        user_logged_in.send(current_app._get_current_object(), user=_get_user())

    可以看到,我们手动调用是将user的属性写入session,并绑定到当前的请求上下文。由于HTTP是无状态连接,每次发起新请求时flask 会创建一个请求上下文,在分发路由时flask-login根据cookie判断用户并绑定到当前的请求上下文,由于这种绑定关系的存在,那么每次新的请求发生时都需要获取user 看一下最后绑定的代码:

        def reload_user(self, user=None):
            ctx = _request_ctx_stack.top
    
            if user is None:
                user_id = session.get('user_id')
                if user_id is None:
                    ctx.user = self.anonymous_user()
                else:
                    if self.user_callback is None:
                        raise Exception(
                            "No user_loader has been installed for this "
                            "LoginManager. Add one with the "
                            "'LoginManager.user_loader' decorator.")
                    user = self.user_callback(user_id)
                    if user is None:
                        ctx.user = self.anonymous_user()
                    else:
                        ctx.user = user
            else:
                ctx.user = user

    self.user_callback就是实现的load_user方法,那么其作用就是每次新请求时调用该方法获取user并绑定到当前的请求上下文,绑定的意义在于每次当我们使用current_user的时候,会直接从当前上下文中返回。
    最后附上一张一次请求flask调用栈:

    收录自:https://segmentfault.com/q/1010000010253582

  • 相关阅读:
    实战演练:通过伪列、虚拟列实现SQL优化
    python try else
    Prince2是怎么考试的?
    Prince2是怎么考试的?
    Prince2是怎么考试的?
    Prince2是怎么考试的?
    拦截器
    拦截器
    拦截器
    拦截器
  • 原文地址:https://www.cnblogs.com/yu-jie/p/9733996.html
Copyright © 2011-2022 走看看