views.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. """celery.views"""
  2. from anyjson import serialize as JSON_dump
  3. from django.http import HttpResponse, Http404
  4. from celery.task import tasks, is_successful, apply_async
  5. from celery.result import AsyncResult
  6. def apply(request, task_name, *args):
  7. """View applying a task.
  8. Example:
  9. http://e.com/celery/apply/task_name/arg1/arg2//?kwarg1=a&kwarg2=b
  10. **NOTE** Use with caution, preferably not make this publicly accessible
  11. without ensuring your code is safe!
  12. """
  13. kwargs = request.method == "POST" and \
  14. request.POST.copy() or request.GET.copy()
  15. kwargs = dict((key.encode("utf-8"), value)
  16. for key, value in kwargs.items())
  17. if task_name not in tasks:
  18. raise Http404("apply: no such task")
  19. task = tasks[task_name]
  20. result = apply_async(task, args=args, kwargs=kwargs)
  21. response_data = {"ok": "true", "task_id": result.task_id}
  22. return HttpResponse(JSON_dump(response_data), mimetype="application/json")
  23. def is_task_successful(request, task_id):
  24. """Returns task execute status in JSON format."""
  25. response_data = {"task": {"id": task_id,
  26. "executed": is_successful(task_id)}}
  27. return HttpResponse(JSON_dump(response_data), mimetype="application/json")
  28. is_task_done = is_task_successful # Backward compatible
  29. def task_status(request, task_id):
  30. """Returns task status and result in JSON format."""
  31. async_result = AsyncResult(task_id)
  32. status = async_result.status
  33. result = async_result.result
  34. if status in ("FAILURE", "RETRY"):
  35. response_data = {
  36. "id": task_id,
  37. "status": status,
  38. "result": result.args[0],
  39. "traceback": result.traceback,
  40. }
  41. else:
  42. response_data = {
  43. "id": task_id,
  44. "status": status,
  45. "result": result,
  46. }
  47. return HttpResponse(JSON_dump({"task": response_data}),
  48. mimetype="application/json")