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

标签 python flask decorator python-decorators

假设我有以下设置(简化):

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 被导入到其他地方时触发,然后我才能设置任何变量。

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

最佳答案

你有两个选择:

  1. 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 文档的章节;特别是循环导入部分。

  2. “手动”应用 @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/

相关文章:

python - 使用folium创建 map 后HTML页面为空白

python - 从静态文件夹导入带有 jinja 的 javascript 文件

python - 使用装饰器检查可选参数

python - 我可以装饰一个显式函数调用吗,比如 np.sqrt()

Python:如何从 script2 运行 script1 并在 script2 中复制 script1 的输出(stdout、stderr)以进行日志记录(到文件中)

python - 使用python在hackerrank中重复字符串问题?

python - 如何放大子图matplotlib?

AngularJS - 服务器端 index.html 和身份验证

python - 查找导入的Python模块

python - 从装饰类继承