How to use Flask-Script and Gunicorn

前端 未结 7 544
[愿得一人]
[愿得一人] 2020-12-02 12:39

I\'m working on on a Flask app using Flask\'s built in dev server. I start it using Flask-Script. I want to switch to using Gunicorn as the web server. To do so, do I nee

相关标签:
7条回答
  • 2020-12-02 13:27

    As Dhaivat said, you can just use your Flask app directly with Gunicorn.

    If you still want to use Flask-Script, you will need to create a custom Command. I don't have any experience with Gunicorn, but I found a similar solution for Flask-Actions and ported it to Flask-Script, although be warned, it's untested.

    from flask_script import Command, Option
    
    class GunicornServer(Command):
    
        description = 'Run the app within Gunicorn'
    
        def __init__(self, host='127.0.0.1', port=8000, workers=4):
            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 handle(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()
    

    You can then either register it to replace Flask's local development server at python manage.py runserver

    manager.add_command("runserver", GunicornServer())
    

    or register as a new command such as python manage.py gunicorn

    manager.add_command("gunicorn", GunicornServer())
    

    Edit June 2016: With the latest version of Flask-Script, change the method handle with __call__. old flask-script vs new flask-script

    0 讨论(0)
提交回复
热议问题