--help flag does not work with QUART_APP envvar and create_app factory

未关闭 适合新手
#483 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
76/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
python
领域
backend, cli

调研方向

首先阅读 quart/cli.py 中 Quart CLI 的应用加载路径,尤其是它如何读取 QUART_APP 并处理顶层 --help 选项。使用通过 QUART_APP 选择的 create_app 工厂复现问题,然后与 --app 进行比较。当 QUART_APP=run quart --help 能在没有导入错误的情况下显示帮助,且报告中的子命令仍可正常运行时,即为完成。

由索引模型根据 Issue 内容生成。

描述

When using a create_app() factory function, the --help flag does not work with QUART_APP envvar but does work with --app flag. All other quart subcommands work such as 'run'.

Minimal example

Layout

.
├── init.py
├── run.py
└── server.py

server.py
from quart import Quart

def create_app(mode='Development'):
    app = Quart(__name__)
    print("hello from create_app")
    return app
run.py
from .server import create_app

def main():
    app = create_app()
    app.run()


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

Expected behaviour

% quart --app=run --help
hello from create_app
Usage: quart [OPTIONS] COMMAND [ARGS]...

  A general utility script for Quart applications. An application to load must
  be given with the '--app' option, 'QUART_APP' environment variable, or with
  an 'app.py' file in the current directory.

Options:
  -e, --env-file FILE   Load environment variables from this file. python-
                        dotenv must be installed.
  -A, --app IMPORT      The QUART application or factory function to load, in
                        the form 'module:name'. Module can be a dotted import
                        or file path. Name is not required if it is 'app',
                        'application', 'create_app', or 'make_app', and can be
                        'name(args)' to pass arguments.
  --debug / --no-debug  Set 'app.debug' separately from '--env'.
  --version             Show the Quart version
  --help                Show this message and exit.

Commands:
  routes  Show the routes for the app.
  run     Run a development server.
  shell   Run a shell in the app context.

% quart --app=run run       
hello from create_app
 * Serving Quart app 'quarttest.server'
 * Debug mode: False
 * Please use an ASGI server (e.g. Hypercorn) directly in production
 * Running on http://127.0.0.1:5000 (CTRL + C to quit)
Incorrect behaviour
% QUART_APP=run quart --help
Error: While importing 'quarttest.app', an ImportError was raised:

Traceback (most recent call last):
  File "/Users/erikmelander/kod/quarttest/venv/lib/python3.11/site-packages/quart/cli.py", line 186, in locate_app
    module = import_module(module_name)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/Cellar/[email protected]/3.11.4_1/Frameworks/Python.framework/Versions/3.11/lib/python3.11/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1140, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'quarttest.app'


Usage: quart [OPTIONS] COMMAND [ARGS]...

  A general utility script for Quart applications. An application to load must
  be given with the '--app' option, 'QUART_APP' environment variable, or with
  an 'app.py' file in the current directory.

Options:
  -e, --env-file FILE   Load environment variables from this file. python-
                        dotenv must be installed.
  -A, --app IMPORT      The QUART application or factory function to load, in
                        the form 'module:name'. Module can be a dotted import
                        or file path. Name is not required if it is 'app',
                        'application', 'create_app', or 'make_app', and can be
                        'name(args)' to pass arguments.
  --debug / --no-debug  Set 'app.debug' separately from '--env'.
  --version             Show the Quart version
  --help                Show this message and exit.

Commands:
  routes  Show the routes for the app.
  run     Run a development server.
  shell   Run a shell in the app context.

% QUART_APP=run quart run   
hello from create_app
 * Serving Quart app 'quarttest.server'
 * Debug mode: False
 * Please use an ASGI server (e.g. Hypercorn) directly in production
 * Running on http://127.0.0.1:5000 (CTRL + C to quit)

Environment:

  • Python version: 3.11
  • Quart version: 0.22.0
主要语言
Python
星标
3.7k
派生
209
PR 合并指标
30 天内没有已合并 PR

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

pallets/quart 的其他 Issue

查看 pallets/quart 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。