Flask中flask 您所在的位置:网站首页 flask实现登录页面跳转 Flask中flask

Flask中flask

2023-03-10 06:05| 来源: 网络整理| 查看: 265

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 = '请先登录!' #关联APPlogin_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 '' % 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 [email protected]('/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)记住我,并不是用户登出之后,再次登录时自动填写用户名和密码(这是浏览器的功能),而是在用户意外退出后(比如关闭浏览器)不用再次登录。

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有