设置登录信息和初始化LoginManager
from flask_login import LoginManager
使用login_user把登陆信息写入cookie的时候需要把LoginManager插入到app上面
login_manager = LoginManager()
# 注册LoginManager
login_manager.init_app(app)
设置login_required权限登陆之后,若没登陆这需要跳转的界面
或者表明使用哪个试图函数实现登陆
login_view这个方法初始化后url才有next参数 表示登陆后需要跳转的界面
login_manager.login_view = 'web.login'
没登陆的时候的错误信息
login_manager.login_message = '请先登录或者注册'
login_user:登陆 设置cookie
官方文档 http://www.pythondoc.com/flask-login/
login_user中可以通过 关键字参数 remember=True 设定记住密码,
配置 REMEMBER_COOKIE_DURATION 可以设置时长(默认365天)
此外 login_user还可以通过 关键字参数 duration 设定指定时长
import datetime
duration = datetime.timedelta(seconds=30) # 30秒
duration = duration
login_user(user, remember=True, duration=duration)
login_user(user, remember=True) # remember相当于记住密码
login_user这里是获取用户模型的id去写如到cookie
通过user(第一个参数)去调用get_id的方法获取id
所以user模型要写一个方法返回id
使用者方法要把login_manager
UserMixin
创建user模型类,继承UserMixin
UserMixin和login_user是在flask_login模块里面
在调用cookie生成的函数的时候,login_user就是生成cookie的函数
需要用到当前玩家的id去设置cookie
而UserMixin里面有可以直接返回id的方法,不用在重新写一个
UserMixin模块写有返回各种属性的方法,而login_user需要获取模型的id
所以User模型可以继承UserMixin类,返回id给login_user
若user模型设置的id不是id(如uid),则还是需要写一个方法进行转换
def get_id(self):
return self.uid
current_user:获取当前的用户
current_user相当于就是实例化的用户对象,可以取用户的其他属性
在user 用户模型实现
根据uid得到用户
用户加载 使得current_user 可以通过uid获取用户
current_user根据user_loader的get_user的方法对用户进行查询
就上面的UserMixin对象,提供了一个get_user的方法获取当前用户的对象
编写get_user 方法用来根据id查询用户,若不写会报错
@login_manager.user_loader
def get_user(uid):
#如果是根据主键查询,不要filter_by,使用get方法即可
#返回表中查询到的用户id
return User.query.get(int(uid))
使用current_user调用UserMixin提供的方法,可对当前进行校验操作
如判断当前用户是否是登录状态,即是否处于已认证状态
if current_user.is_authenticated: #-->登录返回True,否则False
登录了
login_required:
在需要限制登录才能访问的试图函数上,加入**@login_required**装饰器
登陆的视图函数,调用login_user设置cookie的函数
是一个flask_login的回调函数,
在登陆之后,每访问一个带Login_required装饰的视图函数就要执行一次,
该函数返回一个用户对象,通过id来用sql语句查到的用户数据
然后实例化一个对象,并返回
login_required实际上也是去调用了
current_user.is_authenticated
判断是否是登陆状态,如不是就返回到**load_user(user,remember=True)**的视图函数上
logout_user登出,退出登录
判断当前cookie的名称是否在request.cookie里面,如则直接pop弹出
这样cookie就没了,就形成了一个退出的过程(这只是其中一小部分的实现)
@web.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('web.index'))