假设我进行了以下设置(简化):

from flask import Flask
from flask.ext.socketio import SocketIO, emit, send

app = Flask(__name__)
socketio = SocketIO(app)

@socketio.on('connect', namespace='/namespaceOne')
def test_connectOne():
    print('new connection')

@socketio.on('connect', namespace='/namespaceTwo')
def test_connectTwo():
    print('new connection')

if __name__ == '__main__':
socketio.run(app)


我现在想将两个功能test_connectOnetest_ConnectTwo移到单独的模块中。我正在考虑为每个模块创建两个类并使这些函数静态化,如下所示:

class ModuleOne (object):

    @staticmethod
    @socketio.on('connect', namespace='/namespaceOne')
    def test_One():
        print('new connection')


但是与此同时,我遇到了麻烦。我现在必须以某种方式将socketio对象添加到类中(例如,通过将简单的setter与静态变量结合使用)。但是我想注释socketio.on()将在模块ModuleOne导入到其他位置之前立即触发,我可以设置任何变量。

我该如何解决这种情况? (我也乐于接受完全不同方向的解决方案。)

最佳答案

您有两种选择:


socketio对象导入到放置视图的单独模块中。只要在创建socketio对象之后再导入该模块,其他东西就起作用。因此,在您的main模块中,您可以:

from flask import Flask
from flask.ext.socketio import SocketIO, emit, send

app = Flask(__name__)
socketio = SocketIO(app)

import socket_views

if __name__ == '__main__':
    socketio.run(app)


socket_views.py中,您具有:

from main import socketio

@socketio.on('connect', namespace='/namespaceOne')
def test_connectOne():
    print('new connection')

@socketio.on('connect', namespace='/namespaceTwo')
def test_connectTwo():
    print('new connection')


参见Flask文档的Larger Application章节;特别是“循环进口”部分。
手动应用@socketio.on()装饰器; @expression语法只是将可调用项应用于函数的语法糖。由于@socketio.on()装饰器仅注册,因此您可以简单地将视图作为常规的,未修饰的函数放在单独的模块中,然后在导入后将其注册为:

from socket_views import test_connectOne, test_connectTwo

socketio.on('connect', namespace='/namespaceOne')(test_connectOne)
socketio.on('connect', namespace='/namespaceTwo')(test_connectTwo)

关于python - 如何在python中轻松处理动态装饰器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23432791/

10-12 21:08