Flask在封装在decorator中时未执行函数



我有一个基于flask的api。我也在使用可能涉及以下问题的多处理模块。

当使用非平凡的包装器时,flask应用程序只是不执行包装的任务。也没有错误消息,也没有办法使用pycharm调试器进入手头的任务。这种装饰器的最小示例是以下

def test(task):
def g(*args,**kwargs):
return task(*args,**kwargs)
return g

但这是有效的:

def test(task):
return task

知道发生了什么事吗?任务在多处理池中执行

任务以以下方式执行:

pool = multiprocessing.Pool(10, maxtasksperchild=10)
@app.route('/', methods=['POST'])
def test():
task = other_script.task
for i in range(3):
pool.apply_async(task,args=(i,))

在另一个脚本中,我们有类似的内容:

@test
def task(arg):
return 2

深入了解api的具体工作方式会非常冗长。因此,请随时分享基于这一有限信息的有根据的猜测

装饰器是一个包装和替换另一个函数的函数。既然原来的功能被替换了,你需要记住复制将原始函数的信息转换为新函数。使用functools.wraps((为您处理此问题。

所以试试这个方法:

from flask import Flask, Response 
from functools import wraps
app = Flask(__name__)
app.config['TESTING'] = True
def token_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
kwargs['hello'] = 'world!'
return f( *args, **kwargs)
return decorated_function
@app.route("/",methods=["GET"])
@token_required
def index(*args, **kwargs):
return kwargs['hello']
if __name__ == '__main__':

app.run(port=5000,debug=True)

相关内容

  • 没有找到相关文章

最新更新