假设我进行了以下设置(简化):
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
对象导入到放置视图的单独模块中。只要在创建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/