如何在类内的flasksocketio上用uwsgi打补丁,并且在一个线程中启动。

问题描述 投票:0回答:1

我写了一个机器人来监控游戏服务器,提供一个web界面,并通过套接字与客户端进行通信。到目前为止,所有这些工作都很好,运行在flask开发服务器上。

我很想让它与uwsgi一起工作,因为flask建议不要使用他们集成的webserver(尽管它看起来工作得很好)。

我完全不知所措。我把这个东西作为一个学习项目开始,试着教自己一些东西。现在我这里的这个东西看起来和例子、教程或文档中的东西都不一样,我真的甚至不知道该从哪里开始。

所有的文档和教程都说要为uwsgi-server提供入口点,比如模块:app

但这样的结构对我来说并不存在,它更像是 "global_variable:instance_of_a_class:variable:app"

我在这里尽量简化了。

imports...

class Webserver(Module):
    app = object
    websocket = object
    login_manager = object

    def get_module_identifier():
        return "module_webserver"

    def run(self):
        app = Flask(__name__)
        app.config["SECRET_KEY"] = pulled_from_db

        login_manager = LoginManager()
        login_manager.init_app(app)

        self.app = app
        self.websocket = SocketIO(
            app,
            async_mode=pulled_from_db,
            debug=pulled_from_db,
            engineio_logger=pulled_from_db,
            use_reloader=pulled_from_db,
            passthrough_errors=True,
            ping_timeout=15,
            ping_interval=5
        )
        self.login_manager = login_manager

        websocket_instance = Thread(
            target=self.websocket.run,
            args=[self.app],
            kwargs={
                "host": pulled_from_db,
                "port": pulled_from_db
            }
        )
        websocket_instance.start()

        while not self.stopped.wait(self.next_cycle):
            ... do the modules tasks

# modules get instantiated when their file gets imported
loaded_modules_dict[Webserver().get_module_identifier()] = Webserver()

这个类是按需加载的,可能并不总是在那里。我怎么才能让这个东西和uwsgi一起工作呢?任何和所有的建议将被感激

我在其他模块里面使用这些东西,通过modules.webserver.whatever()类型的调用来引用它。

完整的代码在这里。链接到我的项目webserver模块

我很害怕,也做好了改变整个项目结构的准备,但如果有任何机会能让它按原样工作,那就太好了。任何和所有的建议和技巧都将被感激--很遗憾,我甚至还没有找到如何处理这个问题的想法的开始。我对Uwsgi的理解很贫乏,即使在阅读了几个小时的文档和例子之后。整个概念对我来说是陌生的 :)

我唯一的想法是以某种方式将这个模块单列出来,加载到它自己的模块中,然后尝试将其传递给。不,我完全不知道。我知道有人问问题的时候,应该会提供他们尝试过的东西。但我都不知道该从哪里开始思考。我担心我的整个项目实在是太过自以为是,无法挽救 。

python-3.x nginx flask uwsgi flask-socketio
1个回答
0
投票

我认为你混淆了几件事。

反向代理(如nginx)是一个完全独立的web服务器,位于客户端和真正的web服务器之间。你不需要改变任何关于你的应用程序的东西来进行反向代理,只要启动nginx配置成转发请求到它,然后让客户端与nginx而不是你的应用程序对话。这就足够了。

你还提到你的应用使用Flask开发服务器。这不是一个好主意,因为那个web服务器很慢,而且不是很强大。一些流行的web服务器选择是gunicorn和uwsgi,这两种服务器通常都是从命令行启动的,这不是你所遵循的模式,因为你的web服务器位于应用程序的后台线程中。我的建议是你使用eventlet或gevent,这两个都有生产就绪的web服务器。当你运行 pip install eventlet 比如说,你的 socketio.run() 调用将自动使用它,你需要做任何更改。

希望这能帮助你

© www.soinside.com 2019 - 2024. All rights reserved.