当前位置: 首页 > 面试题库 >

如何使用Flask-Script和Gunicorn

公西季
2023-03-14
问题内容

我正在使用Flask的内置开发服务器来开发Flask应用程序。我使用Flask-Script启动它。我想切换为使用Gunicorn作为Web服务器。为此,我需要在Flask-Script和Gunicorn之间编写某种集成代码吗?还是Flask-Script与使用Gunicorn运行应用程序无关?

提前致谢!

到@ sean-lynch的道具。以下是根据他的回答而工作,经过测试的代码。我所做的更改是:

  • 在尝试启动服务器之前,将从sys.argv中删除了Gunicorn无法识别的选项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())

问题答案:

正如Dhaivat所说,你可以直接在Gunicorn中使用Flask应用程序。

如果你仍然想使用Flask-Script,则需要创建一个custom Command。我没有使用Gunicorn的经验,但是我发现了Flask-Actions 的类似解决方案,并将其移植到Flask-Script中,尽管会警告,但未经测试。

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()

然后,你可以注册它来代替瓶的本地开发服务器在python manage.py runserver

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

或注册为新命令,例如 python manage.py gunicorn

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

随着瓶脚本的最新版本,改变方法handle__call__



 类似资料:
  • 看到这章的内容也许你会有疑惑,启动应用?不是很简单吗?我直接使用 python app.py 不就将应用跑起来了吗,而且我还能看到访问的日志呢。是的,没错,直接运行代码是可以将我们编写的 Web 应用跑起来,而且还能很好得查看运行信息,但是,假设你想更换配置呢?例如,你有 development1.py 和 development2.py 两个配置文件,一开始你使用 development1.py

  • 您知道,web应用程序需要会话或cookie来进行身份验证。我尝试用Vue.js和Flask微框架构建web应用程序,例如ERP或CRM。 我很困惑。如何使用会话?让我们假设我们在烧瓶中有这样的代码: 而我们的前端代码应该是这样的: null

  • 问题内容: 我正在使用Flask作为后端,并使用jQuery作为我正在从事的个人项目。 要登录,我想这样做: 在中,我会告诉用户其用户名或密码不正确,等等。 在后端,我的/ login路由如下所示 但是在客户端,浏览器不会重定向,如果我在完整功能中查看响应对象,我会看到通常从我的“ /”路由返回的内容:200 OK和index.html模板。 我的问题是: 有什么方法可以拦截客户端重定向? 我认为

  • 问题内容: 我已经安装了Apache服务器,并且正在通过mod_wsgi处理Flask响应。我已经通过别名注册了WSGI脚本: [httpd.conf] 我在上面的路径中添加了相应的WSGI文件: [/mnt/www/wsgi-scripts/service.wsgi] 我有一个简单的Flask Python测试脚本,提供了服务模块: [/mnt/www/wsgi-scripts/service.

  • 问题内容: 好的,所以我已经安装了Flask,我想知道如何将MongoDB数据库与即将开始构建的Flask应用程序连接和使用。 问题答案: 我个人发现PyMongo库简单易用。 你首先需要导入并创建一个连接: 然后获取你的数据库实例和集合(表): 然后,你可以通过处理保存数据的JSON文档来操纵数据。他们的网站上有完整的示例。

  • 问题内容: 我试图用一个烧瓶形式的sqlalchemy请求的结果填充选择字段。 这是代码: 这是模板: 查看: 模型(仅粘贴了关联表和作者表,很多列都不用了) 我目前收到此错误: 我真正想要的是select字段显示作者姓名及其编号,然后将作者编号返回到应用程序(返回到头上名为“ add_author”的函数)。 问题答案: 你有两个问题: 正如肖恩·维埃拉(Sean Vieira)在回答中指出的那