假设我有以下设置(简化):
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_connectOne
和 test_ConnectTwo
这两个函数移动到单独的模块中。我正在考虑为每个模块创建两个类并使函数静态化,如下所示:
class ModuleOne (object):
@staticmethod
@socketio.on('connect', namespace='/namespaceOne')
def test_One():
print('new connection')
但是我遇到了麻烦。我现在必须以某种方式将 socketio 对象放入类中(例如,通过一个简单的 setter 结合一个静态变量)。但我猜注解 socketio.on()
将在模块 ModuleOne
被导入到其他地方时触发,然后我才能设置任何变量。
我该如何解决这种情况? (我也对进入完全不同方向的解决方案持开放态度。)
最佳答案
你有两个选择:
将
socketio
对象导入到您放置 View 的单独模块中。只要您随后在创建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')
参见 Larger Application Flask 文档的章节;特别是循环导入部分。
“手动”应用
@socketio.on()
装饰器;@expression
语法只是将可调用对象应用于函数的语法糖。由于@socketio.on()
装饰器只注册,你可以简单地将你的 View 作为常规的、未装饰的函数放在单独的模块中,然后在导入后注册它们: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/