首页 > 其他分享 >Flask中flask_login的使用

Flask中flask_login的使用

时间:2023-03-09 09:36:03浏览次数:36  
标签:Flask db 用户 flask user login password id

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

相关文章

  • Python|Flask中的@
    现代Web框架使用路由技术来帮助用户记住应用程序URL,可以直接访问所需的页面,而无需从主页导航。Flask中的route()装饰器用于将URL绑定到函数。例如:@app.route('/hello')de......
  • Flask中根据表单中下拉框的选择跳转指定页面
    HomePage.html中存在一个表单:注意:action不写的话,路由默认在/下方,则该路径下方的函数名可以随意取<h4>CompletetheForm</h4><formid="upload_form"method="POST"......
  • 单例模式应用于login-加装饰器
     importrandomdefsingleton(class_):instances={}defget_instance(*args,**kwargs):ifclass_notininstances:instances[cl......
  • Python Flask 之 路由和渲染模板讲解与示例演示
    目录一、概述二、路由三、渲染模板四、重定向和错误五、日志六、集成WSGI中间件一、概述Flask是一款使用Python编写的Web应用框架,其设计理念是轻量级和简单易学。......
  • Flask
    Flask参考博客1.flask的使用1.1安装pip3installflask1.2使用新建py文件从flask模块导入Flask创建flask实例启动flask(和执行py文件一样,右击run)fromflas......
  • Flask请求上下文
    Flask请求上下文#说实话,当时看完视频知道怎么回事。就是容易忘.....#不过总不能一直看视频对吧,尽快理解和掌握吧....惭愧啊预备知识1.werkzeug当我们下载flask模......
  • 【SQLServer】列出所有login账号
    GetthelistofallLoginAccountsinaSQLServerSELECTnameASLogin_Name,type_descASAccount_TypeFROMsys.server_principalsWHERETYPEIN('U','S','G......
  • flask - fastapi (python 异步API 框架 可以自动生成swagger 文档) 常用示例 以及整合eu
    flask-fastapi(python异步API框架可以自动生成swagger文档)常用示例以及整合eurakanacosflask-fastapi  (python异步API框架 可以自动生成swagger文......
  • Flask学习笔记
    所有路由搜索都是自上而下搜索的注意:返回值为元组数据时,不能以以下形式返回:return('a','b','c')必须要以下面的形式返回: return'内容',*响应码return'11111',200......
  • Nginx+Gunicorn+supervisor部署基于flask开发的项目
    1.概述(1)概述FlaskFlask是Python中有名的轻量级同步web框架Gunicorn高性能的PythonWSGI服务器NginxNginx是一个高性能的HTTP和反向代理服务器,同时也是......