Python 如何通过Flask run或自定义命令运行Flask app,而无需手动设置Flask_app 用例
我有一个python包,它使用Python 如何通过Flask run或自定义命令运行Flask app,而无需手动设置Flask_app 用例,python,flask,python-click,Python,Flask,Python Click,我有一个python包,它使用单击组来拥有多个命令行子命令。 除此之外,我想有一个小烧瓶应用程序 其他子命令是包的主要功能,而不是flask应用程序。 因此,我希望flask命令嵌套在它们自己的组下 例子 我举了一个简单的例子来说明我的问题-它在GitHub上: 什么有效 在最简单的示例中,我设置了一个使用fsksc_server命令运行的mini flask安装。 这要归功于setup.py中的setuptoolsconsole\u scripts入口点挂钩 该命令工作正常,完全符合您的预期:
单击组来拥有多个命令行子命令。
除此之外,我想有一个小烧瓶应用程序
其他子命令是包的主要功能,而不是flask应用程序。
因此,我希望flask命令嵌套在它们自己的组下
例子
我举了一个简单的例子来说明我的问题-它在GitHub上:
什么有效
在最简单的示例中,我设置了一个使用fsksc_server
命令运行的mini flask安装。
这要归功于setup.py
中的setuptoolsconsole\u scripts
入口点挂钩
该命令工作正常,完全符合您的预期:
$ fsksc_server --help
Usage: fsksc_server [OPTIONS] COMMAND [ARGS]...
Run the fsksc server flask app
Options:
--version Show the flask version
--help Show this message and exit.
Commands:
routes Show the routes for the app.
run Runs a development server.
shell Runs a shell in the app context.
(我还没有设置任何路由,因此访问URL会抛出404,但服务器运行正常.)
为了在click子命令中获得flask命令,我在flask组中使用了flaskadd_命令。
此主命令是fsksc
。flask子命令应该是shell
。
目的是让fskscshell运行
启动开发服务器
命令正确显示,因此此部分似乎正常工作:
$ fsksc --help
Usage: fsksc [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
cmd1
cmd2
server Run the fsksc server flask app
什么不起作用
在server
子命令下执行任何操作时,我会收到一条关于NoAppException
异常的警告消息:
$ fsksc server --help
Traceback (most recent call last):
File "/Users/ewels/miniconda2/envs/work/lib/python2.7/site-packages/Flask-1.0.2-py2.7.egg/flask/cli.py", line 529, in list_commands
rv.update(info.load_app().cli.list_commands(ctx))
File "/Users/ewels/miniconda2/envs/work/lib/python2.7/site-packages/Flask-1.0.2-py2.7.egg/flask/cli.py", line 384, in load_app
'Could not locate a Flask application. You did not provide '
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.
Usage: fsksc server [OPTIONS] COMMAND [ARGS]...
Run the fsksc server flask app
Options:
--version Show the flask version
--help Show this message and exit.
Commands:
routes Show the routes for the app.
run Runs a development server.
shell Runs a shell in the app context.
尝试运行服务器时会出现类似错误:
$ fsksc server run
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
Usage: fsksc server run [OPTIONS]
Error: 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\u APP
环境变量来解决这个问题。
然后,flask run
按预期工作:
$ export FLASK_APP=/Users/ewels/GitHub/flask-subcommand-issue/fsksc/server/app.py:create_fsksc_app
$ fsksc server run
* Serving Flask app "/Users/ewels/GitHub/flask-subcommand-issue/fsksc/server/app.py:create_fsksc_app"
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
烧瓶运行
也可以
但是-我不想让我的用户这么做!
我也不想用flask子命令污染我的主命令组
(实际上,我在主组中有更多的子命令)
问题
我需要做什么才能使这项工作如我所愿,而不必定义FLASK\u APP
,并将其作为单击中的嵌套组
提前感谢您的帮助 在项目根目录下创建一个名为.flaskenv
的文件,将以下内容放入其中:
FLASK\u APP=fsksc.server.APP:create\u fsksc\u APP
然后安装python dotenv:
$ pip install python-dotenv
现在,当您执行run命令时,应该自动设置env var。好的,让我走上正确的轨道
不幸的是,由于flask使用.flaskenv
文件的方式,路径必须是绝对的,或者相对于用户的当前工作目录。这两种方法都不适用于安装包的其他用户
然而,当玩这个游戏的时候,我发现做一个简单的os.environ['FLASK\u APP']
很有效!它只需要在脚本执行的早期进行。然后可以根据已安装脚本的位置动态设置路径,我认为一切似乎都正常:
$ fsksc --help
Usage: fsksc [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
cmd1
cmd2
server Run the fsksc server flask app
flaskenv_app_path=os.path.join(os.path.dirname(os.path.dirname(_文件__)),'fsksc','server','app.py')
flaskenv_app_func='{}:创建_fsksc_app'.格式(flaskenv_app_路径)
os.environ['FLASK_APP']=flaskenv_APP_func
我在这里更新了最简单的示例代码:
谢谢你的帮助 太棒了,谢谢!请注意,我必须另外指定一个flask.cli.load_dotenv()
命令才能使其正常工作,但这还有一个额外的好处,即我可以用flask代码将新的.flaskenv
文件整理到子目录中。我还为FLASK_APP使用了一个相对路径
,这样它可以为所有用户工作。我对自己没有弄明白这一点感到有点恼火——我看到了aboutpython dotenv
,但没有把2+2放在一起,意识到这可以解决我的问题。非常感谢。我在GitHub上更新了最小解决方案,以帮助未来的读者:该死,我说得太快了。从其他工作目录启动时,相对路径不起作用。如何让FLASK\u应用程序
适用于任何用户?欢迎!也许您可以传递模块导入路径,检查更新的答案。是的,使用此设置,您必须从项目根目录执行命令。您的解决方案看起来很适合您的需要,请向上投票:)