Flask-Login
,是一个常用的组件,它基于 Session
,适合做有 UI 交互的用户登录。
1、主要功能如下:
- 将活动用户的ID存储在会话中,方便登录和注销用户
- 限制某些视图的访问(登录和未登录用户权限不同),使用@login_required装饰器。
- 方便处理用户会话过期问题( “记住我” 的功能)
- 保护用户会话,防止cookie盗用
- 以后可与Flask-Principal或其他授权扩展相互集成使用
2、安装/引入
pip3 install flask-login
from flask_login import login_user, login_required, LoginManager, current_user, logout_user
3、初始化#设置secret_key
app.secret_key = os.urandom(24) #初始化 login_manager = LoginManager() #会话保护的模式,这里设置为强模式。(还有普通模式basic) login_manager.session_protection = 'strong' #login-view :验证失败跳转的界面
login_manager.login_view = 'login'
#login-message:用户重定向到登录页面时闪出的消息
login_manager.login_message = '请先登录!' #关联APP
login_manager.init_app(app=app)
4、定义用户信息模型,并实现User类,完成数据准备部分。
from werkzeug.security import generate_password_hash #用于加密 from flask_login import UserMixin #用于定义User类 from werkzeug.security import check_password_hash #用于验证密码是否一致 #定义用户信息类,用户名/密码/呢称/角色 class UserInfo(db.Model): """定义数据模型""" __tablename__ = 'userinfos' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) pwd = db.Column(db.String(120), unique=False) # remem=db.Column(db.Boolean,default=True) c_name = db.Column(db.String(80), unique=False) role = db.Column(db.String, unique=False) def __repr__(self): return '<User %r>' % self.username
#定义 User,登录基于用户,需要定义 User 类,Flask-Login 规定 User 类必须实现三个属性和一个方法:is_authenticated 属性is_active 属性is_anonymous 属性get_id() 方法,
#最简单的方法是从 UserMixin 类继承,该类提供了默认的实现。
class User(UserMixin): #将从数据库中查询到的用户对象传到构造函数中,来获取密码/呢称/角色/ID等信息,用于后面的验证等操作。
def __init__(self, user): self.password_hash = user.pwd self.c_name = user.c_name self.role = user.role self.id = user.id #重写验证方法,这个方法需要自己来实现,要根据自己的验证逻辑。其中password为用户在登录页面输入的密码,这里与所要登录用户的密码进行一致性验证。 def verify_password(self, password): return check_password_hash(self.password_hash, password) #以下这个方法必须实现,可以通过用户,获取用户ID def get_id(self): """get user id from profile file, if not exist, it will generate a uuid for the user. """ return self.id @以下这个为类的静态方法,可以用类名+方法名的方式来调用,目的是根据用户ID来获取用户信息,这个方法要根据自己的逻辑进行重写。 @staticmethod def get(user_id): """try to return user_id corresponding User object. This method is used by load_user callback function """ if not user_id: return None result = UserInfo.query.get(user_id) if result: return User(result) else: return None
5、基本使用
(1)要实现user_loader 回调函数,user session 记录的是用户 ID (user_id),回调函数的作用就是通过 user_id 返回对应的 User 对象。user_loader 回调函数在 user_id 非法的时候不应该抛出异常,而要返回 None。没有这个回调函数的话,Flask-Login 将无法工作
@login_manager.user_loader def load_user(user_id): return User.get(user_id)
(2)要实现用户登出功能
@ app.route('/logout') @ login_required def logout(): logout_user() return redirect(url_for('login'))
(3)实现登录验证功能,这里配合使用了flask_wtf模块。
先定义登录表单
# forms.py from flask_wtf import FlaskForm from wtforms import StringField,BooleanField, PasswordField,SubmitField from wtforms.validators import DataRequired,EqualTo,Length # 定义的表单都需要继承自FlaskForm class LoginForm(FlaskForm): # 域初始化时,第一个参数是设置label属性的 username = StringField(u'用户名:', validators=[DataRequired(message="用户名不能为空")]) password = PasswordField(u'密 码:', validators=[DataRequired(u"密码不能为空")]) remember_me = BooleanField(u'记住我', default=False)
编写登录视图函数
from forms import LoginForm
@app.route('/login', methods=['GET', 'POST']) def login(): fm = LoginForm() if fm.validate_on_submit(): user_name = request.form.get('username', None) password = request.form.get('password', None) remember_me = request.form.get('remember_me', False) loguser = UserInfo.query.filter_by(username=user_name).first() if loguser: user = User(loguser) if user.verify_password(password): login_user(user, remember=remember_me) next = request.args.get('next') if not next or not next.startwith('/'): next = url_for('index', page=1) return redirect(next) flash('用户名或密码错误!') return render_template('login.html', form=fm)
利用装饰器限制需登录才能访问的页面。
在需要限制访问的视图函数上面,增加@login_required
@app.route('/find_job', methods=['POST']) @login_required def find():
6、其它应注意事情
(1)current_user 属性
:获取当前用户
return render_template('index.html', jobs=jobs, username=current_user.c_name)
(2)记住我,并不是用户登出之后,再次登录时自动填写用户名和密码(这是浏览器的功能),而是在用户意外退出后(比如关闭浏览器)不用再次登录。
标签:Flask,db,用户,flask,user,login,password,id From: https://www.cnblogs.com/lzszs/p/17197034.html