先加载flask_login
ext.py 在app下的__init__.py 进行引用把,我就不写了
login_manager = LoginManager() # 如果没有登录则重定向到该蓝图的视图函数 login_manager.login_view = "user.login" # 对登录用户进行监视,最高等级 login_manager.session_protection = "strong" def inin_ext(app): login_manager.init_app(app)
然后在数据库用户User模型中除了继承自sqlalhemy之外还继承 flask_login的 UserMixin
modles.py
''' 模型类需要继承flask_login UserMixin ,不然需要重写四个方法 is_active get_id is_authenticated 登录用户 is_anonymous 未登录用户 只需需要理会这两个方法就行 ''' class User(db.Model,UserMixin): id = db.Column(db.Integer,primary_key=True,autoincrement=True) nicheng = db.Column(db.String(20)) email = db.Column(db.String(20)) password_hash = db.Column(db.String(200)) # 以下都是关于密码加密解密 @property def password(self): raise AttributeError('没有权限查看密码!') @password.setter def password(self,password): self.password_hash = generate_password_hash(password) def check_password(self,password): return check_password_hash(self.password_hash,password)
继续在该模型文件中添加 用来获取传递过来的实例
# flask_login的实例 + user_loader 获取在视图函数views.py中login_user传递过来的参数 得到该实例 @login_manager.user_loader def load_user(id): return User.query.get(int(id))
views.py
@user.route('/login/',methods=['GET','POST']) def login(): form = loginForm() if form.validate_on_submit(): email = form.email.data password = form.password.data # 每一偶在表单中验证密码了,直接在这里验证是否为True user = User.query.filter_by(email=email).first() if user is not None and user.check_password(password): # 传入该登录用户的User对象,在modles.py中回调函数会对传入的对象 存入session login_user(user,remember=True) return redirect(url_for('user.index')) return redirect(url_for('user.login')) form.password.data = '' return render_template('login.html',form=form) # 用户退出 @user.route('/logout') def logout(): logout_user() return redirect(url_for("user.index"))
其实只需要记住 在模型中继承flask_login UserMixin 并在模型外添加一个获取用户实例的函数
@login_manager.user_loader def load_user(id): return User.query.get(int(id))
在进行登录时 将登录用户在数据库中查询得到的实例传递过去
login_user(user,remember=True) # user 是登录用户实例
退出登录则使用
logout_user()
保护识图不被未登录用户访问
在每个识图装饰器下添加
@蓝图.route('/xxxx/') @login_required def xxxx(): xxxx retrue 'xxxx'
login_manager.login_view = "user.login" # 该配置会将未登录用户重定向到该识图函数中
其中flask 自带一个 current_app 作为代理对不能导入app实例 进行一个替代 (导入死循环)
flask_login 也带有一个 current_user 可以对当前登录用户进行一个操作,比如数据库模型有id name ,可以对其操作 current_user.name 得到该实例的数据
特别是在jijia2 模板中操作
{% if not current_user.is_authenticated %} <li><a href="{{ url_for("user.login") }}">登录</a></li> <li><a href="{{ url_for("user.register") }}">注册</a></li> {% endif %} {% if current_user.is_authenticated %} <li><a href="{{ url_for("user.index") }}">{{ current_user.nicheng }}</a></li> <li><a href="{{ url_for('user.logout') }}">退出</a></li> {% endif %}
通过 current_user.is_authenticated 对用户登录状态进行一个确定是否为登录用户 current_user.nicheng 显示出该实例用户的昵称
在登录视图函数中添加session的过期时间,不能再配置文件中填写,要在登录时进行书写
login_user(user)
# 设置session过期时间 过期时间一天
session.permanent = True
app = current_app._get_current_object()
app.permanent_session_lifetime = timedelta(days=1)
详细请看 https://www.cnblogs.com/practice-h/p/8883487.html