使用flask run命令时候报错

使用flask run命令时候报错 “ Detected factory 'create_app' in module 'app', but could not call it without arguments. Use 'app:create_app(args)' to specify arguments.”

最近在跟着Flask 狗书 《Flask web开发:基于python的web应用开发实战》学习到第七章时按照组织大型应用的方式重构了以前的练习代码。我将应用实例提到了顶级目录的flasky.py脚本里。然后在app包里设置了工厂函数create_app(config_name)

img

上图是我的目录结构
下面是app包里__init__.py里的代码

from flask import Flask
from flask_bootstrap import Bootstrap
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
from config import config

bootstrap = Bootstrap()
moment = Moment()
db = SQLAlchemy()

# 使用工厂函数创建 app 实例
def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)
    bootstrap.init_app(app)
    moment.init_app(app)
    db.init_app(app)

    return app

下面是flasky.py里的代码

import os
from app import create_app,db
from app.models import Role,User
from flask_migrate import Migrate

app = create_app('default')
migrate = Migrate(app,db)


@app.shell_context_processor
def make_shell_context():
    return dict(db=db,User=User,Role=Role)


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

目前这个程序使用pycharm自带的运行按键是可以正常运行的,只是在终端输入flask run和flask shell时报本文开头提到的错误。
请各位帮忙看看是什么问题

用 python flasky.py运行试试,因为你的默认名不是app.py,所以用这个指令,你先要设置环境变量。让其指向这个flasky.py。设置环境变量的指令为set FLASK_APP = flasky
但是这里建议不用flask run指令,因为你要手动windows环境下创建环境变量,有时候windows下用指令设置环境变量不起作用。请看下面flask run的解释。
有帮助的话采纳一下哦!我的主页flask专栏已经写了22篇,对你的这些问题都有总结,对项目搭建有一定的理解,有问题可以继续交流,另外,你如果有知道这个flask-script扩展包的话,可以用它实现项目运行,总之flask的运行方式很多,我不建议flask run。
解释:
我们可以直接flask run运行程序是因为Flask会根据以下规则自动探测程序实例:
从当前目录中寻找app.py和wsgi.py模块,并从中寻找名为app或application的程序实例
从环境变量FLASK_APP对应的值寻找名为app或application的程序实例

因为我们的程序主模块是app.py,所以这里我们执行flask run命令会自动从当前目录中寻找程序实例。如果我们的程序主模块是其他名称,比如说是hello.py,

那么需要设置环境变量FLASK_APP,将包含程序实例的模块名赋值给这个变量。
windows中使用 set FLASK_APP=hello 命令,如果这个命令设置不了环境变量的话,需要手动设置。你这里就是set FLASK_APP = flasky
linux和mac中使用 export FLASK_APP=hello 命令

执行 export FLASK_APP=flasky

在执行 flask run