Как использовать Flask-Script и Gunicorn
работаю над приложением Flask с помощью FlaskS встроенный в Dev Server. Я запускаю его с помощью Flask-Script. Я хочу перейти на использование Gunicorn в качестве веб-сервера. Для этого нужно ли писать какой-то код интеграции между Flask-Script и Gunicorn? Или Flask-Script не имеет отношения к запуску приложения с помощью Gunicorn?
Заранее спасибо!
Реквизит @ Шон-Линч. Ниже работает проверенный код, основанный на его ответе. Изменения, которые я сделал, были:
Варианты, которые неПризнанные Gunicorn удалены изsys.argv
вremove_non_gunicorn_command_line_args()
прежде чем пытаться запустить сервер. В противном случае Gunicorn выдает ошибку с таким сообщением:error: unrecognized arguments: --port 5010
, Я удаляю-p
потому что, хотя это нене может вызвать ошибку,только потому, что Gunicorn считает его короткой формойpidfile
вариант, который явно не то, чтос намерением.
Подпись GunicornServer.handle () изменена, чтобы соответствовать методу, который она переопределяет, т.е. Command.handle () -
from flask_script import Command
from gunicorn.app.base import Application
class GunicornServer(Command):
description = 'Run the app within Gunicorn'
def __init__(self, host='127.0.0.1', port=8000, workers=6):
self.port = port
self.host = host
self.workers = workers
def get_options(self):
return (
Option('-t', '--host',
dest='host',
default=self.host),
Option('-p', '--port',
dest='port',
type=int,
default=self.port),
Option('-w', '--workers',
dest='workers',
type=int,
default=self.workers),
)
def handle(self, app, *args, **kwargs):
host = kwargs['host']
port = kwargs['port']
workers = kwargs['workers']
def remove_non_gunicorn_command_line_args():
import sys
args_to_remove = ['--port','-p']
def args_filter(name_or_value):
keep = not args_to_remove.count(name_or_value)
if keep:
previous = sys.argv[sys.argv.index(name_or_value) - 1]
keep = not args_to_remove.count(previous)
return keep
sys.argv = filter(args_filter, sys.argv)
remove_non_gunicorn_command_line_args()
from gunicorn import version_info
if version_info < (0, 9, 0):
from gunicorn.arbiter import Arbiter
from gunicorn.config import Config
arbiter = Arbiter(Config({'bind': "%s:%d" % (host, int(port)),'workers': workers}), app)
arbiter.run()
else:
class FlaskApplication(Application):
def init(self, parser, opts, args):
return {
'bind': '{0}:{1}'.format(host, port),
'workers': workers
}
def load(self):
return app
FlaskApplication().run()
manager.add_command('gunicorn', GunicornServer())