假设我得到以下设置(简化):
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)