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插件的方式来实现登录认证功能。
