在flask中创建自定义命令需要访问app,一般是app.py这样创建的:
import click
from flask import Flask
app = Flask(__name__)
@app.cli.command("create-user")
@click.argument("name")
def create_user(name):
...
Run Code Online (Sandbox Code Playgroud)
但是,为了不让我的 app.py 膨胀,我想将我的自定义命令放在一个单独的文件中,例如commands.py,但这不起作用,因为我的项目的入口点是app.py,所以我必须导入应用程序commands.py并导入我的命令app.py会导致循环导入错误。
如何在单独的文件中创建自定义命令?
我想使用“flask”命令从终端运行一些命令,但它不起作用。
\n\n以下是我的项目结构-
\n\nFlaskUserAuthentication\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 FlaskUserAuthentication\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 API\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db_models.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 routes.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Site\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 routes.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 static\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 form_style.css\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 Site\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base_layout.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 logout.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 profile.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 signin.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 signup.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 commands.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 run.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 venv\nRun Code Online (Sandbox Code Playgroud)\n\n作为flask run命令运行应用程序时,我确信我的环境变量设置正确。但是,当我尝试使用 Flask-cli-command 时,例如 -
flask create_db\nRun Code Online (Sandbox Code Playgroud)\n\n我明白了,Error: No such command "create_db". …
python environment-variables command-line-arguments flask flask-cli
你如何让Flask CLI命令接受一个参数?
Flask似乎自定义了Click Group对象,所以这不起作用:
@app.cli.command()
@app.cli.argument('email')
def user_info(email):
...
Run Code Online (Sandbox Code Playgroud) 我尝试使用flask cli启动我的应用程序,即flask run。我使用FLASK_APP环境变量指向我的应用程序,即export FLASK_APP=package_name.wsgi:app
在我的wsgi.py文件中,我使用工厂函数创建应用,即app = create_app(config),我的create_app方法如下所示:
def create_app(config_object=LocalConfig):
app = connexion.App(config_object.API_NAME,
specification_dir=config_object.API_SWAGGER_DIR,
debug=config_object.DEBUG)
app.app.config.from_object(config_object)
app.app.json_encoder = JSONEncoder
app.add_api(config_object.API_SWAGGER_YAML,
strict_validation=config_object.API_SWAGGER_STRICT,
validate_responses=config_object.API_SWAGGER_VALIDATE)
app = register_extensions(app)
app = register_blueprints(app)
return app
Run Code Online (Sandbox Code Playgroud)
但是,该应用程序无法启动,出现错误:
无法从“ package_name.wsgi:app”获得有效的Flask应用程序。
为什么是这样?
当我使用gunicorn时,我可以正常启动我的应用程序,即 gunicorn package_name.wsgi:app
我正在尝试添加commands到我的 Flask 应用程序中。
这是我的__init__.py文件:
import os
from flask import Flask
from flask_cors import CORS
from flask_mongoengine import MongoEngine
app = Flask(__name__)
CORS(app)
app.config.from_object(os.environ['APP_SETTINGS'])
db = MongoEngine(app)
import slots_tracker_server.views # noqa
Run Code Online (Sandbox Code Playgroud)
如果我添加它:
@app.cli.command()
def test_run():
print('here')
Run Code Online (Sandbox Code Playgroud)
我可以flask test_run毫无问题地运行,但如果我尝试将代码移动到另一个文件,例如: ,我在尝试运行命令时commands.py会收到错误。Error: No such command "test_run".
我缺少什么?
我想注册一个在Flask应用程序工厂的单独文件中定义的CLI命令。此命令需要访问app.config。但是,current_app.config从命令访问会引发RuntimeError: Working outside of application context.
app/__init__.py
from flask import Flask
from app.commands import my_command
def create_app():
app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile("config.py")
app.add_command(my_command)
return app
Run Code Online (Sandbox Code Playgroud)
instance/config.py
TEST_VARIABLE = "TESTVALUE"
Run Code Online (Sandbox Code Playgroud)
app/commands.py
from flask import current_app
@click.command()
def my_command():
click.echo(current_app.config["TEST_VARIABLE"])
Run Code Online (Sandbox Code Playgroud)
我希望能运行flask my_command输出TESTVALUE。但是,出现以下错误:
RuntimeError: Working outside of application context.
This typically means that you attempted to use functionality that needed
to interface with the current application object in some way. To solve
this, set …Run Code Online (Sandbox Code Playgroud) 我正在使用flask 和flask-restful 开发REST API。我目前在使用flask-cli 时遇到问题,因为在公司环境中我无法运行该应用程序。可能是什么问题?
在企业中,我们使用 conda 环境,用于 python 3 应用程序。目前api的环境由python 3.6.8和flask 1.0.2和flask-restful 0.37组成,在CentOS 7上运行。即使通过conda的需求或enviroment.yml重新创建环境,我也无法运行应用程序,不同从我的个人机器 ubuntu 18.04,使用 miniconda3 和 env python 3.6.8,使用相同的烧瓶包,我可以毫无问题地进行测试。
错误:
File "/home/user/opt/miniconda3/envs/comands/lib/python3.6/site-packages/flask/cli.py", line 235, in locate_app
__import__(module_name)
ModuleNotFoundError: No module named 'main'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/user/opt/miniconda3/envs/comands/lib/python3.6/site-packages/flask/cli.py", line 325, in __call__
self._flush_bg_loading_exception()
File "/home/user/opt/miniconda3/envs/comands/lib/python3.6/site-packages/flask/cli.py", line 313, in _flush_bg_loading_exception
reraise(*exc_info)
File "/home/user/opt/miniconda3/envs/comands/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
raise value
File "/home/user/opt/miniconda3/envs/comands/lib/python3.6/site-packages/flask/cli.py", line 302, in _load_app
self._load_unlocked()
File "/home/user/opt/miniconda3/envs/comands/lib/python3.6/site-packages/flask/cli.py", …Run Code Online (Sandbox Code Playgroud)