如何在FastAPI中使用Flask-Admin?创建双应用后遇调用报错
解决FastAPI挂载Flask-Admin时的TypeError问题
错误原因
FastAPI的mount()方法要求传入ASGI兼容的应用对象,但你直接传入了Flask-Admin的Admin实例——它本身不是可调用的ASGI/WSGI应用,因此触发TypeError: 'Admin' object is not callable。正确的做法是挂载已经注册了Admin的Flask应用,同时需要用WSGIMiddleware把Flask的WSGI应用转换为ASGI兼容形式(因为FastAPI是ASGI框架)。
修复步骤及代码示例
- 导入
WSGIMiddleware(来自fastapi.middleware.wsgi) - 用
WSGIMiddleware包装你的Flask应用 - 将包装后的Flask应用挂载到FastAPI的
/admin路径下(Flask-Admin已注册在Flask app上,访问该路径会自动跳转Admin界面) - 修正SQLAlchemy会话的传递方式(ModelView应接收sessionmaker实例,而非直接的Session对象)
修改后的完整代码:
from flask import Flask from fastapi import FastAPI from fastapi.middleware.wsgi import WSGIMiddleware from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from flask_admin import Admin from flask_admin.contrib.sqla import ModelView # 导入你的模型类 from models import Users, Rooms, UsersToRooms, Maps flask_app = Flask(__name__) # Flask必须设置SECRET_KEY,否则Admin表单功能会报错 flask_app.config['SECRET_KEY'] = 'your-custom-secret-key' fastapi_app = FastAPI() fastapi_app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="templates") # 数据库配置 engine = create_engine('your-database-connection-url') # 创建会话工厂,用于生成数据库会话 SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # 初始化Flask-Admin并注册到Flask应用 admin = Admin(flask_app, template_mode='bootstrap4') # 使用会话工厂生成的会话实例 admin.add_view(ModelView(Users, SessionLocal())) admin.add_view(ModelView(Rooms, SessionLocal())) admin.add_view(ModelView(UsersToRooms, SessionLocal())) admin.add_view(ModelView(Maps, SessionLocal())) # 用WSGIMiddleware包装Flask应用,挂载到FastAPI的/admin路径 fastapi_app.mount("/admin", WSGIMiddleware(flask_app))
额外优化建议
如果需要更优雅的数据库会话管理,可以自定义ModelView并实现get_session方法,避免重复创建会话实例:
class CustomModelView(ModelView): def get_session(self): return SessionLocal() # 使用自定义视图类注册模型 admin.add_view(CustomModelView(Users, engine)) admin.add_view(CustomModelView(Rooms, engine))
内容的提问来源于stack exchange,提问作者Knjaz1989 Knjaz1989
相关产品推荐
相关产品推荐

