Как создать пользовательское приложение Gunicorn с помощью команд Click?

Я пытаюсь создать пользовательское приложение, используя gunicorn сервер с flask фреймворком, используя click команды. Я использовал класс App для создания приложения с командой say_hello, которая выводит Hello на терминал:

import click
from flask import Flask
from gunicorn.app.base import BaseApplication

class App(BaseApplication):
    def __init__(self, options=None):
        self.options = options or {}
        self.application = Flask(__name__)
        super(App, self).__init__()

    def load_config(self):
        config = dict([(key, value) for key, value in self.options.items()
                       if key in self.cfg.settings and value is not None])
        for key, value in config.items():
            self.cfg.set(key.lower(), value)

    def load(self):
        return self.application

    @click.command()
    def say_hello(self):
        print('Hello')

options = {
    'bind': '%s:%s' % ('127.0.0.1', '5000'),
    'workers': 2
}

app = App(options)

Когда я пытаюсь запустить это приложение с помощью команды gunicorn test:app, я получаю эту ошибку:

[2022-12-30 14:39:20 -0500] [302113] [INFO] Starting gunicorn 20.1.0
[2022-12-30 14:39:20 -0500] [302113] [INFO] Listening at: http://127.0.0.1:8000 (302113)
[2022-12-30 14:39:20 -0500] [302113] [INFO] Using worker: sync
[2022-12-30 14:39:20 -0500] [302114] [INFO] Booting worker with pid: 302114
Application object must be callable.
[2022-12-30 14:39:20 -0500] [302114] [INFO] Worker exiting (pid: 302114)
[2022-12-30 14:39:20 -0500] [302113] [INFO] Shutting down: Master
[2022-12-30 14:39:20 -0500] [302113] [INFO] Reason: App failed to load.

Если я изменю app = App(options) на app = App(options).application, приложение запустится с одним воркером, но в исходном коде установлено 2 воркера.

Как создать пользовательское приложение с командами Click?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно вызвать app.run(), чтобы запустить пользовательское приложение Gunicorn.

Запустите сервер Gunicorn с помощью другой команды Click (группы) вместо того, чтобы сделать команду Click методом экземпляра пользовательского приложения Gunicorn:

@click.group()
def cli():
    pass


@cli.command()
def runserver():
    app.run()


@cli.command()
def say_hello():
    print('Hello')


cli()

Выполните команду для пользовательского приложения Gunicorn:

python test.py runserver

Выполнить команду для программы CLI:

python test.py say-hello

Использованная литература:

Другие вопросы по теме