Flask + Flask-Scriptでgunicornをマニアックに起動する

HerokuでpythonのWebアプリを動かすとき

Flask-Scriptを使っている場合、

== manager.py ==

from flask import Flask
from flask_script import Manager

app = Flask(__name__)
manager = Manager(app)

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

== Procfile ==

web: gunicorn manager:app

と書けば何ら問題なくデプロイできます。

しかし、

Flask-Script を使って開発サーバーを動かすときの

$ python manage.py runserver

のような python manage.py XXX という書式のマニアックな起動をしたいときはどうすればよいのでしょう?

python manage.py XXX 形式でのWebサーバーの起動方法

python - How to use Flask-Script and Gunicorn - Stack Overflow の記事を参考に所望の起動ができました

== manage.py ==

import os
from flask import Flask
from flask_script import Manager, Server, Command, Option

app = Flask(__name__)

class GunicornServer(Command):
    def __init__(self, host='127.0.0.1', port=8000, workers=1):
        self.port = port
        self.host = host
        self.workers = workers

    def get_options(self):
        return (
            Option('-H', '--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 __call__(self, app, host, port, workers):

        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:
            from gunicorn.app.base import Application

            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 = Manager(app)
manager.add_command('gunicorn', GunicornServer(host='0.0.0.0', port=os.environ.get('PORT', 5000)))


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

== Procfile ==

python manage.py gunicorn

で無事にHeroku上で python manage.py XXX 書式でWebアプリが動きます。

あと、Herokuにデプロイするときはポート番号を環境変数PORTの値にしておかないといけません (PORTの値はデプロイするたびに変わるので)

とりあえず、マニアックなやり方でWebアプリを起動できましたが自己満足できるということ以外にこちらの方法を取るメリットが今のところ思いつかないです。。