美文网首页
Flask中的flask_login

Flask中的flask_login

作者: 极客匠 | 来源:发表于2020-02-08 23:34 被阅读0次

    Flask- login为Flask提供了用户会话管理。它处理登录、注销和长时间记住用户会话等常见任务。

    安装

    pip install flask-login
    

    Login_Manager

    LoginManager是一个类,有多个方法和属性;此类初始化的对象用于保存用于登录的设置。实例:class:LoginManager * *不绑定到特定应用程序,因此可以在代码的主体中创建一个,然后将其绑定到您的应用程序app中 工厂函数。

    初始化一个LoginManager类对象

    login_manager = LoginManager()
    

    init__app() – 配置该对象

    login_manager.init_app(app)
    def create_app(test_config=None):
        ...
        login_manager.init_app(app)
        ...
    
    

    user_loader() 回调函数

    自定义回调函数,这将设置从会话重新加载用户的回调。 您设置的函数应该使用用户ID(“unicode”)并返回用户对象,如果用户不存在则返回“None”。

    @login_manager.user_loader
    def load_user(userid):
        return User.get(userid)
    

    在执行该段代码之后,注册了load_user()这个自定义的callback。

    reload_user()

    1. 首先获取user id,如果获取不到有效的id,就将user设为anonymous user
    2. 获取到id后,再通过@login_manager.user_loader装饰的函数获取到user对象,如果没有获取到有效的user对象,就认为是anonymous user
    3. 最后将user保存于request context中(无论是正常的用户还是anonymous用户)

    (实例属性的配置)

    login-view :验证失败跳转的界面

    login_manager.login_view = "/" 跳转到/首页目录

    login-message:用户重定向到登录页面时闪出的消息

    login_manager.login_message ='Please login first!'

    self.login_message = LOGIN_MESSAGE
    

    refresh-view:用户需要重新进行身份验证时要重定向到的视图的名称。

    login_manager.refresh_view = "/"

    needs-refresh-message:用户重定向到“需要刷新”页面时闪出的消息。

    login_manager.needs_refresh_message = 'Refresh for login!'
    

    session-protection:使用会话保护的模式。这可以是'basic'(默认)或'strong',或None禁用

    login_manager.session_protection = ‘strong’
    

    utils

    Login_required

    current_user.is_authenticated,判断当前用户是否认证,如果没有认证的话就执行unauthorized(),
    unauthorized()会重定向到login_view参数设置的路由函数中去,所以在实例化LoginManager后要设置login_view属性,
    当用户没有登陆时,会自动重定向到登陆界面,没有设置会返回401错误, 用户登陆后,这个装饰器就直接返回func(*args, **kwargs),相当于没有包装一样,装饰器起到包装接口的作用。

    @login_required
    @auth.route('/logout')
    def logout():
        logout_user()
        return redirect(url_for('index'))
    
    

    Login_user

    用户登录操作,用户在通过自定义的login视图函数,通过验证并登录成功后,需要

    @auth.route('/login', methods=['GET', "POST"], endpoint='login')
    def login():
        if request.method == 'GET':
            form = LoginForm()
            return render_template('login.html', form=form)
        if request.method == 'POST':
            form = LoginForm(formdata=request.form)
            if form.validate():
                password_hash = hashlib.md5(form.data['password'].encode('utf-8')).hexdigest()
                user_obj = db.session.query(User).filter(db.and_(User.username == form.data['username'],
                                                              User.password == password_hash)).first()
                if user_obj:
                    login_user(user_obj)
                    return redirect(url_for('chat.chat'))
                else:
                    flash('用户名或密码错误')
                    return redirect(url_for('auth.login'))
            else:
                for error in form.errors:
                    flash(form.errors[error][0])
                return redirect(url_for('auth.login'))
    

    logout_user

    登出功能类似,除了基本的操作外,还需要把flask-login中的登出进行操作

    @login_required
    @auth.route('/logout')
    def logout():
        logout_user()
        return redirect(url_for('index'))
    

    UserMixin

    is_authenticated
    当用户通过验证时,也即提供有效证明时返回 True 。(只有通过验证的用户会满足 login_required 的条件。)

    is_active
    如果这是一个活动用户且通过验证,账户也已激活,未被停用,也不符合任何你 的应用拒绝一个账号的条件,返回 True 。不活动的账号可能不会登入(当然, 是在没被强制的情况下)。

    is_anonymous
    如果是一个匿名用户,返回 True 。(真实用户应返回 False 。)

    get_id()

    返回一个能唯一识别用户的,并能用于从 user_loader 回调中加载用户的 unicode 。注意着 必须 是一个 unicode —— 如果 ID 原本是 一个 int 或其它类型,你需要把它转换为 unicode 。
    要简便地实现用户类,你可以从 UserMixin 继承,它提供了对所有这些方法的默认 实现。(虽然这不是必须的。)

    Flask-Login 一般使用基础流程

    Flask-Login 通过 user session,提供登录的常见任务,比如登入 (logging in)、登出 (logging out) 和当前用户 (current user)

    login_user():实现用户的登入,一般在登入的视图函数中调用

    logout_user():实现登出功能

    current_user 属性:获取当前用户
    如果需要页面是授权用户才可见,在相应视图函数前加上 @login_required 装饰器进行声明即可,@login_required 装饰器对于未登录用户访问,默认处理是重定向到 LoginManager.login_view 所指定的视图

    总结:熟悉flask-login的源码,掌握其使用的基础流程。

    每天多努力那么一点点,积少成多

    相关文章

      网友评论

          本文标题:Flask中的flask_login

          本文链接:https://www.haomeiwen.com/subject/aueixhtx.html