You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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框架)。

修复步骤及代码示例

  1. 导入WSGIMiddleware(来自fastapi.middleware.wsgi)
  2. 用WSGIMiddleware包装你的Flask应用
  3. 将包装后的Flask应用挂载到FastAPI的/admin路径下(Flask-Admin已注册在Flask app上,访问该路径会自动跳转Admin界面)
  4. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 00:54:30