您的位置:首页 > 健康 > 养生 > 妖精直播_广东网络seo推广_自媒体_域名注册入口

妖精直播_广东网络seo推广_自媒体_域名注册入口

2024/10/11 6:28:27 来源:https://blog.csdn.net/weixin_67719939/article/details/142712315  浏览:    关键词:妖精直播_广东网络seo推广_自媒体_域名注册入口
妖精直播_广东网络seo推广_自媒体_域名注册入口

flask_login是flask框架中的一个拓展功能,用于更快捷的实现用户会话管理功能,主要处理登录,注销和长时间会话存储的功能处理。

目录

安装

使用 

第一步,配置SECRET_KEY

 第二步,创建LoginManager实例绑定app

第三步,用户类继承UserMixin

第四步,实现加载用户方法

第五步,使用登录身份验证

第六步,受身份验证保护的视图

其他,注销与验证失败

调用流程逻辑

用户登录

 登录用户请求其他路由


安装

pip install flask-login

使用 

第一步,配置SECRET_KEY

首先我们要在flask中的config里配置一个键值对:

SECRET_KEY:'你自己设置的字符串'

这个key的作用在于加密cookie等其他提升安全性的地方,还会用来管理api用户身份验证

app.config['SECRET_KEY'] = 'ec9439cfc6c796ae2029594d'

 第二步,创建LoginManager实例绑定app

创建一个登录管理器的实例,并绑定到flask中的app上

loginManager的作用在于:随着flask中app的生命周期去跟踪用户的登录状态与会话数据(可以理解为,额外开辟了内存去进行session的管理与存储功能)

# 写法一
login_manager = LoginManager(app)
# 写法二
login_manager = LoginManager()
login_manager.init_app(app)

第三步,用户类继承UserMixin

定义User对象,

usermixin能够让flask_login正确识别我们定义的user类,并且还额外提供了方法去完成工作。

像是is_authenticated(用户是否认证)、is_active(用户是否活跃) 和 is_anonymous(是否为匿名用户)

class User(db.Model, UserMixin):  # 继承一下flask_login中的UserMixin__tablename__ = 'userinfo'id: Mapped[int] = mapped_column(Integer, primary_key=True)nickname: Mapped[str] = mapped_column(String, nullable=False)mail: Mapped[str] = mapped_column(String, nullable=False)password: Mapped[str] = mapped_column(String, nullable=False)groupid: Mapped[int] = mapped_column(Integer)

第四步,实现加载用户方法

在flask-login中提供了两种方法去进行用户认证,对应的我们需要去返回用户实例给他去进行存储

第一种是: user_loader,通过用户唯一标识去身份验证

是普遍使用的会话管理方法,用户在登录的时候,将用户唯一标识和用户实例存起来

@login_manager.user_loader  # 我们需要返回一个当前会话的用户实例给flask_login
def load_user(user_id):# 这里的db.session.get是sqlalchemy中的方法[根据uid去库里拿数据再创建为一个User实例返回]# 无论是什么方法,只要给其返回一个对象的实例就好了return db.session.get(User, user_id)  # 如果没有对应的实例,返回None

后续该用户在

第二种是:request_loader,每一次请求都去进行身份验证

通常在使用token进行身份验证,自定义身份验证逻辑,支持跨域请求的时候用到。

@login_manager.request_loader
def request_loader(request):email = request.form.get('email')if email not in users:returnuser = User()user.id = emailreturn user

第五步,使用登录身份验证

def do_login(mail: str, password: str) -> bool:# 这里查询User表,条件为mail等于传进来的参数mailquery = Select(User).where(User.mail == mail)# 再扔到这里去执行,拿返回值attempted_user = db.session.scalar(query)# 如果账号存在,且密码匹配的话if attempted_user and attempted_user.check_password_correction(password):# 做一个登录的动作# 调用了flask login方法,在返回的头中会加上set-cookie字段login_user(attempted_user)return True  # 登录成功 返回一个truereturn False  # 验证没通过返回false# api:登录接口
@user_bp.route('/login', methods=['POST'])
def user_login():mail = request.form['mail']password = request.form['password']# note:首先对字段判空# 判断传进来的参数是否合法if not Tool.check_field(mail, max_len=50) or not Tool.check_field(password, min_len=6, max_len=36):return Response.fail(message='非法参数')# 登录 存放sessionuser_service.do_login(mail, password)return Response.success(message='登录成功')

第六步,受身份验证保护的视图

flask_login中有一个login_required,将这个装饰在想要受身份限制的视图当中,只有登录进行身份验证后才能正常请求,不然会被拦截。

# api:发布文章
@post_bp.route('/publish', methods=['POST'])
@login_required
def post_publish():return Response.success(message='发布成功')

 第七步,current_user

在客户端带着cookie去访问路由的时候,flask-login会在调用视图之前去检查cookie当中的信息,如果是已经登录过的用户,则会自动调用我们先前编写的user_loader方法去获取user实例,并存放到current_user当中。

我们可以直接在current_user当中去获取当前登录用户实例中的参数

from flask_login import login_required, current_user@user_bp.route('/group', methods=['GET'])
@login_required
def user_groupinfo():if not current_user:return Response.fail(message='身份验证失败')# 根据current user拿group id,或者其他字段group_id = current_user.groupid

其他,注销与验证失败

可以自定义身份验证失败后返回的响应

@login_manager.unauthorized_handler
def unauthorized():return redirect(url_for('login'))  # 重定向到登录页面

注销的使用

@app.route('/logout')
def logout():flask_login.logout_user()return 'Logged out'

调用流程逻辑

用户登录

 登录用户请求其他路由

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com