我有一个基于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)