flask_login模块主要是用来验证登陆的插件,使用起来肯定比自己写要方便得多
Flask-Login 通过 user session,提供登录的常见任务,比如登入 (logging in)、登出 (logging out) 和当前用户 (current user)
login_user() 函数:实现用户的登入,一般在登入的视图函数中调用
logout_user() 函数:实现登出功能
current_user 属性:获取当前用户
对于使用者来说,如果需要页面是授权用户才可见,在相应视图函数前加上 @login_required 装饰器进行声明即可,@login_required 装饰器对于未登录用户访问,默认处理是重定向到 LoginManager.login_view 所指定的视图
下面我们来看看flask_login的具体用法
首先安装模块
01.pip install flask_login
然后需要我们去应用工厂注册注册该模块和app绑定,还是把我项目的工厂函数发上来
01.#!/usr/bin/python302.#coding:utf-803.from flask import Flask04.from app.web import web05.from config import load_json06.from .common import db,mail07.from flask_login import LoginManager08.import logging09.import os10.import time11.config = load_json()12.loginmanager=LoginManager()13.loginmanager.login_view='web.login' #没有登录直接跳转的地址14.loginmanager.session_protection='strong'15.loginmanager.login_message='please login !'16. 17.def create_app():18. app = Flask(__name__)19. app.secret_key = 'sulao'20. configure_db(app)21. db.init_app(app)22. register_blueprint(app)23. configure_mail(app)24. mail.init_app(app)25. configure_logger(app)26. loginmanager.init_app(app)27. return app28. 29.def configure_db(app):30. #查询时会显示原始SQL语句31. app.config['SQLALCHEMY_ECHO'] = True32. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True33. app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://{db_user}:{db_pass}@{db_host}:{db_port}/{db_name}?charset=utf8mb4'.format(34. db_user=config['db']['db_user'],35. db_pass=config['db']['db_pass'],36. db_host=config['db']['db_host'],37. db_port=config['db']['db_port'],38. db_name=config['db']['db_name'])39. 40.def configure_mail(app):41. app.config['MAIL_SERVER'] = config['mail']['mail_host']42. app.config["MAIL_PORT"] = config['mail']['mail_port']43. app.config["MAIL_USE_SSL"] = True44. app.config["MAIL_USERNAME"] = config['mail']['mail_user']45. app.config["MAIL_PASSWORD"] = config['mail']['mail_pass']46. 47.def configure_logger(app):48. log_dir_name = "logs"49. log_file_name = 'logger-' + time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.log'50. log_file_str = log_dir_name + os.sep + log_file_name51. log_level = logging.WARNING52. handler = logging.FileHandler(log_file_str, encoding='UTF-8')53. handler.setLevel(log_level)54. logging_format = logging.Formatter(55. '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')56. handler.setFormatter(logging_format)57. app.logger.addHandler(handler)58. 59.def register_blueprint(app):60. app.register_blueprint(web, url_prefix='')
然后还需要对模型进行修改,我的模型如下
01.#!/usr/bin/python302.#coding:utf-803.from datetime import datetime04.from app.common import db05.from flask_login import AnonymousUserMixin06. 07.class Category(db.Model):08. __tablename__ = "category"09. cateid = db.Column(db.Integer, primary_key=True, autoincrement=True)10. catname = db.Column(db.String(255))11. thumb = db.Column(db.String(255))12. listorder = db.Column(db.Integer)13. aliasname = db.Column(db.String(255))14. ismenu = db.Column(db.Integer, default=1)15. rootid = db.Column(db.Integer, default=0)16. parentid = db.Column(db.Integer, default=0)17. __mapper_args__ = {18. "order_by": cateid.desc()19. }20. 21.class Post(db.Model):22. __tablename__ = 'post'23. postid = db.Column(db.Integer, primary_key=True, autoincrement=True)24. cateid = db.Column(db.Integer)25. userid = db.Column(db.Integer)26. tag = db.Column(db.String(255))27. thumb = db.Column(db.String(255))28. status = db.Column(db.Integer, default=1)29. aliasname = db.Column(db.String(255))30. istop = db.Column(db.Integer)31. title = db.Column(db.String(255))32. intro = db.Column(db.Text(65536))33. content = db.Column(db.Text(16777216))34. posttime = db.Column(db.DateTime, default=datetime.utcnow)35. updatetime = db.Column(db.DateTime, default=datetime.utcnow)36. __mapper_args__ = {37. "order_by": postid.desc()38. }39. 40.class Tag(db.Model):41. __tablename__ = 'tag'42. tagid = db.Column(db.Integer, primary_key=True, autoincrement=True)43. tagname = db.Column(db.String(32))44. letter = db.Column(db.String(64))45. postid = db.Column(db.Integer)46. __mapper_args__ = {47. "order_by": tagid.desc()48. }49. 50.class Comment(db.Model):51. __tablename__ = 'comment'52. commentid = db.Column(db.Integer, primary_key=True, autoincrement=True)53. postid = db.Column(db.Integer)54. status = db.Column(db.Integer, default=0)55. title = db.Column(db.String(32))56. email = db.Column(db.String(128))57. content = db.Column(db.String(255))58. posttime = db.Column(db.DateTime, default=datetime.utcnow)59. ipaddress = db.Column(db.String(16))60. useragent = db.Column(db.String(255))61. __mapper_args__ = {62. "order_by": commentid.desc()63. }64. 65.class User(db.Model):66. __tablename__ = 'user'67. userid = db.Column(db.Integer, primary_key=True, autoincrement=True)68. level = db.Column(db.Integer)69. status = db.Column(db.Integer, default=1)70. name = db.Column(db.String(32))71. nick = db.Column(db.String(32))72. password = db.Column(db.String(32))73. email = db.Column(db.String(128))74. ipaddress = db.Column(db.String(16))75. posttime = db.Column(db.DateTime, default=datetime.utcnow)76. __mapper_args__ = {77. "order_by": userid.desc()78. }79. def is_authenticated(self):80. if isinstance(self,AnonymousUserMixin):81. return False82. else:83. return True84. def is_active(self):85. return True86. def is_anonymous(self):87. if isinstance(self,AnonymousUserMixin):88. return True89. else:90. return False91. def get_id(self):92. return unicode(self.id)93. 94.class Upload(db.Model):95. __tablename__ = 'upload'96. attchmentid = db.Column(db.Integer, primary_key=True, autoincrement=True)97. userid = db.Column(db.Integer)98. size = db.Column(db.Integer)99. filepath = db.Column(db.String(255))100. alt = db.Column(db.String(255))101. mimetype = db.Column(db.String(255))102. posttime = db.Column(db.DateTime, default=datetime.utcnow)103. __mapper_args__ = {104. "order_by": attchmentid.desc()105. }106. 107.class Setting(db.Model):108. __tablename__ = 'setting'109. systemid = db.Column(db.Integer, primary_key=True)110. name = db.Column(db.String(32))111. configure = db.Column(db.Text(65536)
以上添加的类的方法介绍
01.is_authenticated:表示user对象是否登录02.is_active:表示用户是否激活,如:激活状态和未激活状态采用不同的处理03.is_anonymous:表示访问者是否处于未登录的匿名状态04.get_id:返回user对象的唯一识别标志
然后是视图函数的使用方法
首先需要在login函数中注册
01.from flask_login import login_user,login_required,logout_user,current_user02.@web.route('/login/', methods=['POST', 'GET'])03.def login():04. form = LoginForm(request.form)05. if request.method == "POST" and form.validate():06. username = request.form.get('username')07. password = request.form.get('password')08. user = db.session.query(User).filter_by(username == username).first()09. if user:10. # 将用户信息注册到flask-login中11. login_user(user)12. next = request.args.get('next')13. if user.check_password(password):14. return redirect(url_for('web.member'))15. else:16. pass_err = "密码不正确"17. return render_template('mylogin.html', pass_err=pass_err, form=form)18. else:19. name_err = "用户名不正确"20. return render_template('mylogin.html', name_err=name_err, form=form)21. return render_template('account.html', form=form)22. 23.@web.route('/logout/')24.@login_required# 装饰器,必须登录才能有权限 ****25.def logout():26. logout_user()27. return redirect(url_for('web.login'))
前端示例
01.<--> 用户如果登录则显示用户名,否则给出登录和注册的链接 </--> 02.{% if current_user.is_authenticated %}03. <li class="layui-nav-item">04. <a href="javascript:;">05. {{ current_user.username }}06. </a>07. <dl class="layui-nav-child">08. <dd><a href="" target="page_content">基本资料</a></dd>09. <dd><a href="">安全设置</a></dd>10. </dl>11. </li>12. <li class="layui-nav-item"><a href="{{ url_for("cms.logout") }}">退了</a></li>13. {% else %}14. <li class="layui-nav-item"><a href="{{ url_for("cms.login") }}">登录</a></li>15. <li class="layui-nav-item"><a href="{{ url_for("cms.register") }}">注册</a></li>16. {% endif %}
内容版权声明:除非注明,否则皆为本站原创文章。
转载注明出处:https://sulao.cn/post/669
评论列表