Weipeng Studio.

flask 命令行运行报错:无法定位flask应用

字数统计: 660阅读时长: 3 min
2019/10/04 Share

最近使用Flask配置命令行来进行数据库的管理时遇到了以下错误:

1
2
3
4
5
6
Traceback (most recent call last):
File "c:\users\xue\documents\codings\virtualenv_ws\flask_ws\lib\site-packages\flask\cli.py", line 556, in list_commands
rv.update(info.load_app().cli.list_commands(ctx))
File "c:\users\xue\documents\codings\virtualenv_ws\flask_ws\lib\site-packages\flask\cli.py", line 399, in load_app
"Could not locate a Flask application. You did not provide "
flask.cli.NoAppException: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.

原本在练习flask_blog的时候也使用了这种方法,但是没有报错,这次在新项目中报错了,很大的原因是python环境配置的原因,于是好奇心让我去一探究竟。

在 _init_.py 文件中定义注册了flask命令行的选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def register_commands(app):
@app.cli.command()
@click.option('--drop', is_flag=True, help='Create after drop.')
def initdb(drop):
"""Initialize the database."""
if drop:
click.confirm('This operation will delete the database, do you want to continue?', abort=True)
db.drop_all()
click.echo('Drop tables.')
db.create_all()
click.echo('Initialized database.')

@app.cli.command()
def init():
"""Initialize Albumy."""
click.echo('Initializing the database...')
db.create_all()

# click.echo('Initializing the roles and permissions...')
# Role.init_role()

click.echo('Done.')
@app.cli.command()
@click.option('--user', default=10, help='Quantity of users, default is 10.')
def forge(user):
"""Generate fake data."""

from Albumy.fake import fake_user

db.drop_all()
db.create_all()

click.echo('Generating %d users...' % user)
fake_user()
click.echo('Done.')

这个代码可以在启动flask服务器后,使用flask命令去执行自定义操作。


回到问题中来,我之前使用pipenv创建了虚拟环境,该虚拟环境创建在了之前项目的目录中,然后这次我还是在那个环境中,切换到了新项目的文件夹下运行python文件。换句话说就是,在老环境中运行新项目。

这也许就会导致虚拟环境中的flask无法找到当前运行的app的位置。

在flask中经常涉及到上下文的概念,因为flask允许在一个解释器中运行多个flask应用程序(我的理解就是对于解释器来说,所有python代码都是一样的,那么我们区分这个python代码是哪一个应用程序的就需要用到上下文的概念)

那么这个问题应该也是默认多个应用程序所导致的,查找资料得到,在终端中需要手动设定当前的app是哪一个, set FLASK_APP=main.py 这样之后再使用flask命令就可以正确对应到当前的app上啦。

CATALOG