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

执行flask db init时出现KeyError: <flask.cli.ScriptInfo>错误求助

解决Flask-Migrate执行flask db init时的KeyError问题

看起来你遇到的问题是Flask CLI调用create_app时传递的参数不符合预期导致的KeyError,我来帮你一步步解决这个问题。

错误原因分析

当你运行flask db init这类Flask CLI命令时,Flask会自动调用你的create_app函数,但默认情况下它传递的不是你预期的字符串配置名称(比如'development'),而是一个ScriptInfo对象。这就导致app_config[config_name]找不到对应的字典键,直接抛出了KeyError。


解决方案1:修改create_app函数,兼容CLI调用

你可以调整create_app的参数处理逻辑,让它能应对这种情况,比如给参数设置默认值,或者判断传入的是否是ScriptInfo对象:

首先在__init__.py顶部新增必要的导入,然后修改函数:

# app/__init__.py
# third-party imports
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_migrate import Migrate
import os  # 新增导入
import flask  # 新增导入用于判断对象类型
# local imports
from config import app_config

# db variable initialization
db = SQLAlchemy()
login_manager = LoginManager()

def create_app(config_name=None):
    # 如果没有传入配置名,或者传入的是ScriptInfo对象,就用环境变量或默认值
    if config_name is None or isinstance(config_name, flask.cli.ScriptInfo):
        config_name = os.getenv('FLASK_ENV', 'development')
    
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_object(app_config[config_name])
    app.config.from_pyfile('config.py')
    
    db.init_app(app)
    login_manager.init_app(app)
    login_manager.login_message = "You must be logged in to access this page."
    login_manager.login_view = "auth.login"
    
    migrate = Migrate(app, db)
    
    from app import models
    
    # temporary route
    @app.route('/')
    def hello_world():
        return 'Hello, World!'
    
    return app

这样修改后,不管是手动传入配置名,还是Flask CLI自动调用,都能正常获取到正确的配置名称。


解决方案2:通过环境变量指定create_app的参数

如果你不想修改代码,也可以在运行命令前,通过设置FLASK_APP环境变量来指定create_app的参数:

Windows命令行:

set FLASK_APP=app:create_app('development')
flask db init

Windows PowerShell:

$env:FLASK_APP="app:create_app('development')"
flask db init

Linux/macOS终端:

export FLASK_APP=app:create_app('development')
flask db init

这样Flask CLI就会带着正确的配置名称调用create_app,不会再出现KeyError。


额外检查点

别忘了确认你的config.py里的app_config字典确实包含你指定的配置键(比如'development'),比如:

# config.py
class DevelopmentConfig:
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///your-db-name.db'
    # 其他配置项...

app_config = {
    'development': DevelopmentConfig,
    # 可以按需添加production、testing等配置类
}

如果app_config里没有对应的键,即使传递了正确的名称也会报错哦。

内容的提问来源于stack exchange,提问作者EJ Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:54:33