欢迎访问宙启技术站
智能推送

flask_admin.contrib.sqla的登录认证功能详解

发布时间:2023-12-27 13:29:48

Flask-Admin是一个为Flask应用程序提供快速建立管理界面的插件。Flask-Admin.contrib.sqla模块提供了对SQLAlchemy模型的管理界面。在Flask-Admin.contrib.sqla中,可以通过继承ModelView类创建自定义的管理界面,并且可以对这些界面添加登录认证功能。

登录认证功能是指在访问管理界面之前要求用户进行身份认证。Flask-Admin.contrib.sqla模块提供了两种方式来实现登录认证功能:基于Flask-Login插件和基于Flask-Session插件。下面将分别介绍这两种方式的详细步骤和使用例子。

1. 基于Flask-Login插件的登录认证功能:

步骤1:安装Flask-Login插件

     $ pip install Flask-Login
     

步骤2:创建一个自定义的登录视图

   from flask_admin.base import AdminView
   from flask_login import login_required, current_user

   class MyLoginView(AdminView):
       @expose('/')
       @login_required
       def index(self):
           if not current_user.is_authenticated:
               return redirect(url_for('.login'))
           return render_template('my_login.html')
   

步骤3:创建一个自定义的用户模型

   from flask_login import UserMixin
   from flask_sqlalchemy import SQLAlchemy

   db = SQLAlchemy()

   class User(db.Model, UserMixin):
       __tablename__ = 'users'
       id = db.Column(db.Integer, primary_key=True)
       username = db.Column(db.String(50), unique=True)
       password = db.Column(db.String(100))
   

步骤4:初始化Flask-Admin模块

   from flask_admin import Admin
   from flask_login import LoginManager

   admin = Admin()
   login_manager = LoginManager()

   def create_app():
       app = Flask(__name__)
       app.config['SECRET_KEY'] = 'your_secret_key'
       app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_uri'
       db.init_app(app)
       login_manager.init_app(app)
       admin.init_app(app)
       admin.add_view(MyLoginView(MyModel, db.session))  # 添加自定义的登录视图

       return app

   login_manager.login_view = '/admin/login'
   

例子:

   from flask_admin.contrib.sqla import ModelView
   from flask_admin import Admin
   from flask_login import LoginManager, current_user, login_required
   from flask import Flask, redirect, url_for

   app = Flask(__name__)
   app.config['SECRET_KEY'] = 'your_secret_key'  # 设置密钥
   app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_uri'  # 设置数据库连接URI

   db = SQLAlchemy(app)
   login_manager = LoginManager(app)
   admin = Admin(app)

   class User(db.Model):
       __tablename__ = 'users'
       id = db.Column(db.Integer, primary_key=True)
       username = db.Column(db.String(50), unique=True)
       password = db.Column(db.String(100))

   class MyModelView(ModelView):
       @expose('/')
       @login_required  # 添加登录认证装饰器
       def index(self):
           if not current_user.is_authenticated:
               return redirect(url_for('.login'))
           return super(MyModelView, self).index()

   admin.add_view(MyModelView(User, db.session))

   if __name__ == '__main__':
       app.run()

   

2. 基于Flask-Session插件的登录认证功能:

步骤1:安装Flask-Session插件

     $ pip install flask_session
     

步骤2:创建一个自定义的登录视图

   from flask_admin.base import AdminView
   from flask import session
   from functools import wraps

   def login_required(f):
       @wraps(f)
       def decorated_view(*args, **kwargs):
           if not session.get('logged_in'):
               return redirect(url_for('.login'))
           return f(*args, **kwargs)
       return decorated_view

   class MyLoginView(AdminView):
       @expose('/')
       @login_required
       def index(self):
           return render_template('my_login.html')
   

步骤3:初始化Flask-Admin模块

   from flask_admin import Admin

   admin = Admin()

   def create_app():
       app = Flask(__name__)
       app.config['SECRET_KEY'] = 'your_secret_key'
       app.config['SESSION_TYPE'] = 'filesystem'
       admin.init_app(app)
       admin.add_view(MyLoginView(MyModel, db.session))  # 添加自定义的登录视图

       return app

   

例子:

   from flask_admin.contrib.sqla import ModelView
   from flask_admin import Admin
   from flask import Flask, session, redirect, url_for, render_template

   app = Flask(__name__)
   app.config['SECRET_KEY'] = 'your_secret_key'  # 设置密钥
   app.config['SESSION_TYPE'] = 'filesystem'  # 设置session类型为文件系统

   db = SQLAlchemy(app)
   admin = Admin(app)

   class User(db.Model):
       __tablename__ = 'users'
       id = db.Column(db.Integer, primary_key=True)
       username = db.Column(db.String(50), unique=True)
       password = db.Column(db.String(100))

   def login_required(f):
       @wraps(f)
       def decorated_view(*args, **kwargs):
           if not session.get('logged_in'):
               return redirect(url_for('.login'))
           return f(*args, **kwargs)
       return decorated_view

   class MyModelView(ModelView):
       @expose('/')
       @login_required  # 添加登录认证装饰器
       def index(self):
           return super(MyModelView, self).index()

   admin.add_view(MyModelView(User, db.session))

   if __name__ == '__main__':
       app.run()
   

以上就是Flask-Admin.contrib.sqla的登录认证功能的详细步骤和使用例子。可以根据需要选择基于Flask-Login插件或者基于Flask-Session插件的方式来实现登录认证功能。