Guest User

Untitled

a guest
Apr 23rd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. from flask_celery import Celery
  2. from flask import has_request_context, make_response, request
  3.  
  4.  
  5. class CeleryWithContext(Celery):
  6. def init_app(self, app):
  7. super(MyCelery, self).init_app(app)
  8.  
  9. task_base = self.Task
  10.  
  11. class ContextTask(task_base):
  12.  
  13. #: Name of the additional parameter passed to tasks
  14. #: that contains information about the original Flask request context.
  15. CONTEXT_ARG_NAME = '_flask_request_context'
  16.  
  17. def __call__(self, *args, **kwargs):
  18. """Execute task code with given arguments."""
  19. call = lambda: super(ContextTask, self).__call__(*args, **kwargs)
  20.  
  21. context = kwargs.pop(self.CONTEXT_ARG_NAME, None)
  22. if context is None or has_request_context():
  23. return call()
  24.  
  25. with app.test_request_context(**context):
  26. result = call()
  27.  
  28. # process a fake "Response" so that
  29. # ``@after_request`` hooks are executed
  30. app.process_response(make_response(result or ''))
  31.  
  32. return result
  33.  
  34. def apply_async(self, args=None, kwargs=None, **rest):
  35. self._include_request_context(kwargs)
  36. return super(ContextTask, self).apply_async(args, kwargs, **rest)
  37.  
  38. def apply(self, args=None, kwargs=None, **rest):
  39. self._include_request_context(kwargs)
  40. return super(ContextTask, self).apply(args, kwargs, **rest)
  41.  
  42. def retry(self, args=None, kwargs=None, **rest):
  43. self._include_request_context(kwargs)
  44. return super(ContextTask, self).retry(args, kwargs, **rest)
  45.  
  46. def _include_request_context(self, kwargs):
  47. """Includes all the information about current Flask request context
  48. as an additional argument to the task.
  49. """
  50. if not has_request_context():
  51. return
  52.  
  53. # keys correspond to arguments of :meth:`Flask.test_request_context`
  54. context = {
  55. 'path': request.path,
  56. 'base_url': request.url_root,
  57. 'method': request.method,
  58. 'headers': dict(request.headers),
  59. 'data': request.form
  60. }
  61. if '?' in request.url:
  62. context['query_string'] = request.url[(request.url.find('?') + 1):]
  63.  
  64. kwargs[self.CONTEXT_ARG_NAME] = context
  65.  
  66. setattr(ContextTask, 'abstract', True)
  67. setattr(self, 'Task', ContextTask)
  68.  
  69.  
  70. celery = CeleryWithContext()
Add Comment
Please, Sign In to add comment