Есть задача, обернуть некоторое имеющийся api в «ленивые декораторы»
идея такая, в цепочку различных декораторов api добавляется @lazy_request
который вместо выполнения запроса, создаёт celery.task и возвращает id таска, данные по которому можно получить позже
я сделал так:
def set_auth(required=False):
...
def get_django_session():
...
def get_session_region(session, default_home_region):
...
def lazy_request(countdown=5):
"""Декоратор отдаёт функцию на выполнение в celery очередь"""
def lazy_request_(fun):
@celery.task()
def celery_fun(*args, **kwargs):
with app.test_request_context():
request.cookies = kwargs.pop('cookies')
return fun(*args, **kwargs)
@wraps(fun)
def wrapper(*args, **kwargs):
kwargs['cookies'] = request.cookies # запоминаем сессию для контекста внутри celery
result = celery_fun.apply_async(args=args, kwargs=kwargs, countdown=countdown )
return jsonify( task_id=result.id )
return wrapper
return lazy_request_
@app.route('/api/lazy_diff/<int:a>/<int:b>', methods=["GET"])
@lazy_request()
@set_auth(required=True)
@chech_role_permission('is_superuser')
def lazy_diff(a, b, **kwargs):
return dict( result = a-b )
@app.route('/api/lazy_sum/<int:a>/<int:b>', methods=["GET"])
@lazy_request()
@set_auth(required=True)
@chech_role_permission('is_staff')
def lazy_sum(a, b, **kwargs):
return dict( result = a+b )
всё работает, создаётся task и выполняется, но почему то всегда celery выполняет только первую (в даннам случае lazy_diff), ну соответственно в результатах всега только разница
не понимаю, почему такое поведение?