Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

routes.py 2.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.routes
  4. ~~~~~~~~~~~~~
  5. Contains utilities for working with task routers,
  6. (:setting:`CELERY_ROUTES`).
  7. """
  8. from __future__ import absolute_import
  9. from celery.exceptions import QueueNotFound
  10. from celery.five import string_t
  11. from celery.utils import lpmerge
  12. from celery.utils.functional import firstmethod, mlazy
  13. from celery.utils.imports import instantiate
  14. __all__ = ['MapRoute', 'Router', 'prepare']
  15. _first_route = firstmethod('route_for_task')
  16. class MapRoute(object):
  17. """Creates a router out of a :class:`dict`."""
  18. def __init__(self, map):
  19. self.map = map
  20. def route_for_task(self, task, *args, **kwargs):
  21. try:
  22. return dict(self.map[task])
  23. except KeyError:
  24. pass
  25. except ValueError:
  26. return {'queue': self.map[task]}
  27. class Router(object):
  28. def __init__(self, routes=None, queues=None,
  29. create_missing=False, app=None):
  30. self.app = app
  31. self.queues = {} if queues is None else queues
  32. self.routes = [] if routes is None else routes
  33. self.create_missing = create_missing
  34. def route(self, options, task, args=(), kwargs={}):
  35. options = self.expand_destination(options) # expands 'queue'
  36. if self.routes:
  37. route = self.lookup_route(task, args, kwargs)
  38. if route: # expands 'queue' in route.
  39. return lpmerge(self.expand_destination(route), options)
  40. if 'queue' not in options:
  41. options = lpmerge(self.expand_destination(
  42. self.app.conf.CELERY_DEFAULT_QUEUE), options)
  43. return options
  44. def expand_destination(self, route):
  45. # Route can be a queue name: convenient for direct exchanges.
  46. if isinstance(route, string_t):
  47. queue, route = route, {}
  48. else:
  49. # can use defaults from configured queue, but override specific
  50. # things (like the routing_key): great for topic exchanges.
  51. queue = route.pop('queue', None)
  52. if queue:
  53. try:
  54. Q = self.queues[queue] # noqa
  55. except KeyError:
  56. raise QueueNotFound(
  57. 'Queue {0!r} missing from CELERY_QUEUES'.format(queue))
  58. # needs to be declared by publisher
  59. route['queue'] = Q
  60. return route
  61. def lookup_route(self, task, args=None, kwargs=None):
  62. return _first_route(self.routes, task, args, kwargs)
  63. def prepare(routes):
  64. """Expands the :setting:`CELERY_ROUTES` setting."""
  65. def expand_route(route):
  66. if isinstance(route, dict):
  67. return MapRoute(route)
  68. if isinstance(route, string_t):
  69. return mlazy(instantiate, route)
  70. return route
  71. if routes is None:
  72. return ()
  73. if not isinstance(routes, (list, tuple)):
  74. routes = (routes, )
  75. return [expand_route(route) for route in routes]