如何轻松处理python中的动态装饰?

问题描述 投票:1回答:1

假设我得到以下设置(简化):

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会触发。

我该如何解决这种情况? (我对解决方案持开放态度,这也是一个完全不同的方向。)

python flask decorator python-decorators
1个回答
4
投票

您有两种选择:

  1. 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章节;特别是循环进口部分。
  2. '手动'应用@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)
© www.soinside.com 2019 - 2024. All rights reserved.