【问题标题】:How to patch in uwsgi on a flask/socketio that lives inside a class and is starting in a thread如何在类内并在线程中启动的烧瓶/socketio上修补uwsgi
【发布时间】:2020-04-28 19:34:06
【问题描述】:

我编写了一个机器人来监控游戏服务器、提供网络界面并通过套接字与客户端进行通信。到目前为止,所有这些都运行良好,耗尽了烧瓶开发服务器。

我很乐意让它与 uwsgi 一起工作,因为 flask 建议不要使用他们的集成网络服务器(即使它看起来工作得很好)

我完全不知所措。将这件事作为一个学习项目开始,在我前进的过程中尝试自学。现在我有这个东西,它看起来不像在示例、教程或文档中找到的任何东西,我什至不知道从哪里开始。

所有的文档和教程都提到了为 uwsgi-server 提供的入口点,比如 module: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() 类型的调用引用它

完整代码在这里:link to my projects webserver module

我担心并准备好改变项目的整个结构,但如果有任何机会让它按原样工作,那就太好了。任何和所有建议和提示将不胜感激 - 遗憾的是,我什至还没有找到关于如何解决这个问题的想法的开始。即使在阅读了数小时的文档和示例之后,我对 uwsgi 的理解也很差。整个概念对我来说是陌生的:)

我唯一的想法是以某种方式挑出这个模块,自己加载它并尝试将其传递给。不,我完全不知道。我知道有人提出问题会提供他们尝试过的东西。但我什至不知道从哪里开始思考。我担心我的整个项目都太靠自学了,无法挽救:/

【问题讨论】:

    标签: python-3.x nginx flask uwsgi flask-socketio


    【解决方案1】:

    我认为你混淆了一些事情。

    反向代理(例如 nginx)是一个完全独立的 Web 服务器,位于客户端和您的真实 Web 服务器之间。您无需更改应用程序的任何内容即可对其进行反向代理,只需启动配置为向其转发请求的 nginx,然后让客户端与 nginx 而不是您的应用程序对话。仅此而已。

    您还提到您正在为您的应用程序使用 Flask 开发服务器。这不是一个好主意,因为那个 Web 服务器很慢而且不是很健壮。 Web 服务器的一些流行选择是 gunicorn 和 uwsgi,您通常都从命令行开始,这不是您遵循的模型,因为您的 Web 服务器位于应用程序的后台线程中。我的建议是您使用 eventlet 或 gevent,两者都有生产就绪的 Web 服务器。例如,在您运行 pip install eventlet 后,您的 socketio.run() 调用将自动使用它,您需要进行任何更改。

    希望这会有所帮助!

    【讨论】:

    • 在设法实际执行 reverse_proxy 之后,我现在知道它们是完全分开的。无论如何,我想使用 uwsgi,这正是我的问题所在。我根本不知道要使用哪个入口点或如何解决这个问题。我正在使用 gevent。这仍然通过烧瓶开发服务器运行。直到我设法修补uwsgi?这不是为人类设计的,这一点很清楚。如何检查使用哪台服务器?我以为是烧瓶,但是如果加载了 gevent 你是说它不再了吗?我会尽量解决我关于 reverse_proxy 的问题,谢谢。
    猜你喜欢
    • 2017-11-16
    • 2018-02-02
    • 1970-01-01
    • 2015-05-08
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2016-04-01
    相关资源
    最近更新 更多