Я пытаюсь создать пользовательское приложение, используя 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?
Вам нужно вызвать 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
Использованная литература: