celery 的 集成 以及 ansible api 的调用过程。
django 框架集成了celery ,初衷就是一下 请求到view 的时候,需要执行一些耗时程序,需要一个异步的东西,来代替执行。
jumpserver 中 出现了大量 这样的源码。
class AssetRefreshHardwareApi(generics.RetrieveAPIView):
"""
Refresh asset hardware info
"""
queryset = Asset.objects.all()
serializer_class = serializers.AssetSerializer
permission_classes = (IsSuperUser,)
def retrieve(self, request, *args, **kwargs):
asset_id = kwargs.get('pk')
asset = get_object_or_404(Asset, pk=asset_id)
task = update_asset_hardware_info_manual.delay(asset)
return Response({"task": task.id})
这是一个 刷新资产资产硬件信息的 视图类 , 在 retrive 方法中 ,根据 url 中的 pk 参数,弹道 asset 实例后,然后调用了一个方法
update_asset_hardware_info_manual.delay 方法 ,这个方法是什么,首先来看源码。
@shared_task
def update_asset_hardware_info_manual(asset):
# task_name = _("Update asset hardware info")
task_name = _("更新资产硬件信息")
return update_assets_hardware_info_util([asset], task_name=task_name)
@shared_task 语法糖 ,装饰器模式 在 干什么 ,点进源码 看一下,这个 装饰器 作用就是 update_asset_hardware_info_manual 跟 参数 asset 参数 传入 到 装饰器里,具体实现 看源码
def shared_task(*args, **kwargs):
"""Create shared tasks (decorator).
Will return a proxy that always takes the task from the current apps
task registry.
This can be used by library authors to create tasks that will wo