【2】Flask写用户登陆功能

一、导入并初始化 Flask-Login 库

edenpedian.py中初始化

login.py

login.html

encrypt.py

users.py

py_user

这个介绍很详细 http://www.cnblogs.com/cjnmy36723/p/5201551.html

但是需要自己建立一个mysql数据库和建立test这个库和py-user这个表

二、在需要登陆的界面前面加入login_required装饰器来

from flask_login import login_required
@app.route('/post')
@login_required
def post():
    pass

三、显示登陆状态

当我们登录了以后,我们的用户信息,也就是User对象会自动的保存在session中。 我们可以通过引入current_user的方式获取当前的用户。如下:

from flask_security import  current_user

@app.route('/user/login', methods=['POST', 'GET'])
def login():
    if not current_user.is_anonymous:
        return redirect(url_for('index'))
    form = forms.LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user is None:
            form.errors['username_error'] = 'user does not exit'
            return render_template('login.html', form=form)
        if not user.password == form.password.data:
            form.errors['password_error'] = 'password is not right'
            return render_template('login.html', form=form)
        login_user(user, remember=True)
        return redirect(url_for('index'))
    return render_template('login.html', form=form)

上面是登录的代码。我们可以看到我们import的仍然是Flask-Security的current_user而不是Flask-Login的。 我们先判断当前的user是不是匿名用户(未登录的就是匿名用户)。如果不是,说明已经登录了,重定向到首页。这里我们就是引用了current_user。它其实就是我们使用Flask-Security创建的User对象。它包含了所有的User对象的属性和方法。可以看到我们发现用户未登录后,首先判断是不是表单提交以及表单提交是否通过。如果通过了就从数据库中查询出用户的信息。 判断用户是否存在以及填写的密码是否正确。登录后,这个User对象就赋值给current_user了。 我们甚至可以在模板页面中直接使用current_user。如下:

<div class="col-md-12 column">
        <h4>
            你好 {{ current_user.email }}
        </h4>
    </div> 

四、角色保护

好了,回到主线。当我们拥有了用户和角色以后, 就可以很方便的使用Flask-Security的装饰器来保护我们的页面了。 @roles_required(‘Admin’)可以用来保护一个路由方法。只有当前用户拥有Admin的角色的时候才被准许访问(关于当前用户的管理是Flask-Login的内容,我们暂且知道这个事情就好,之后我会详细解释)。例如下面的使用方法:

@app.route('/config/save', methods=['POST'])
@roles_required('Admin')
def save_config():

注:roles_required这个装饰器一定要放在app.route下面。否则会有问题。 当用户没有Admin权限的时候是无法访问这个路由方法的。它会通过flush函数像页面反馈错误信息。如下:

除了roles_required之外,你还可以使用roles_accepted。 他们之前的区别就是前者必须严格的拥有所指定的权限,后者是只要拥有其中一个权限就可以。如下:

@roles_accepted(‘editor’, ‘author’) 这段的意思就是要求用户至少拥有这两种role其中的一种就可以访问。 当然除了使用装饰器以外,Flask-Security也是支持以编码的方式控制权限的。例如:

@app.route('/')
@app.route('/index', methods=['GET', 'POST'])
@login_required
def index():
    if current_user.has_role('Admin'):
        names = Env.query.all()
        return render_template('index.html', names=names)
    else:
        names = current_user.envs
        return render_template('index.html', names=names)

这段代码我们使用current_user.has_role方法来判断我们当前用户是属于哪一种角色的(current_user是Flask-Security针对Flask-Login做的扩展,作用是在当前session中维护用户的信息,之后会详细说明)。关于Flask-Security提供的更多方法,请参照文档:https://pythonhosted.org/Flask-Security/api.html

参考资料

http://www.cnblogs.com/cjnmy36723/p/5201551.html http://www.cnblogs.com/cjnmy36723/p/5212047.html http://www.pythondoc.com/flask-login/#id1

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn