Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过Flask run或自定义命令运行Flask app,而无需手动设置Flask_app 用例_Python_Flask_Python Click - Fatal编程技术网

Python 如何通过Flask run或自定义命令运行Flask app,而无需手动设置Flask_app 用例

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入口点挂钩 该命令工作正常,完全符合您的预期:

我有一个python包,它使用
单击
组来拥有多个命令行子命令。
除此之外,我想有一个小烧瓶应用程序

其他子命令是包的主要功能,而不是flask应用程序。 因此,我希望flask命令嵌套在它们自己的组下

例子 我举了一个简单的例子来说明我的问题-它在GitHub上:

什么有效 在最简单的示例中,我设置了一个使用
fsksc_server
命令运行的mini flask安装。 这要归功于
setup.py
中的setuptools
console\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组中使用了flask
add_命令。
此主命令是
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使用了一个相对路径
,这样它可以为所有用户工作。我对自己没有弄明白这一点感到有点恼火——我看到了about
python dotenv
,但没有把2+2放在一起,意识到这可以解决我的问题。非常感谢。我在GitHub上更新了最小解决方案,以帮助未来的读者:该死,我说得太快了。从其他工作目录启动时,相对路径不起作用。如何让
FLASK\u应用程序
适用于任何用户?欢迎!也许您可以传递模块导入路径,检查更新的答案。是的,使用此设置,您必须从项目根目录执行命令。您的解决方案看起来很适合您的需要,请向上投票:)