Jak korzystać ze skryptu Flask-Script i Gunicorn
Pracuję nad aplikacją Flask za pomocą wbudowanego w Dev serwera Flask. Zaczynam go za pomocą skryptu kolby. Chcę przełączyć się na używanie Gunicorn jako serwera WWW. Aby to zrobić, czy muszę napisać jakiś kod integracji między skryptem Flask a skryptem Gunicorn? Czy też skrypt Flask-Script nie ma znaczenia dla uruchamiania aplikacji za pomocą Gunicorn?
Z góry dziękuję!
Rekwizyty do @ sean-lynch. Poniżej przedstawiono działający, przetestowany kod oparty na jego odpowiedzi. Wprowadziłem zmiany:
Opcje, które nie są rozpoznawane przez Gunicorn, są usuwane zsys.argv
wremove_non_gunicorn_command_line_args()
przed próbą uruchomienia serwera. W przeciwnym razie Gunicorn zgłasza błąd z taką wiadomością:error: unrecognized arguments: --port 5010
. Usuwam-p
ponieważ nawet jeśli nie powoduje błędu, to tylko dlatego, że Gunicorn uważa, że jest to jego krótka formapidfile
opcja, która oczywiście nie jest zamierzona.
Sygnatura GunicornServer.handle () zmodyfikowana tak, aby pasowała do metody, którą zastępuje, tj. 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())