__init__.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # -*- coding: utf-8 -*-
  2. """
  3. celery.backends
  4. ~~~~~~~~~~~~~~~
  5. Backend abstract factory (...did I just say that?) and alias definitions.
  6. """
  7. from __future__ import absolute_import
  8. import sys
  9. from kombu.utils.url import _parse_url
  10. from celery.local import Proxy
  11. from celery._state import current_app
  12. from celery.five import reraise
  13. from celery.utils.imports import symbol_by_name
  14. __all__ = ['get_backend_cls', 'get_backend_by_url']
  15. UNKNOWN_BACKEND = """\
  16. Unknown result backend: {0!r}. Did you spell that correctly? ({1!r})\
  17. """
  18. BACKEND_ALIASES = {
  19. 'amqp': 'celery.backends.amqp:AMQPBackend',
  20. 'rpc': 'celery.backends.rpc.RPCBackend',
  21. 'cache': 'celery.backends.cache:CacheBackend',
  22. 'redis': 'celery.backends.redis:RedisBackend',
  23. 'mongodb': 'celery.backends.mongodb:MongoBackend',
  24. 'db': 'celery.backends.database:DatabaseBackend',
  25. 'database': 'celery.backends.database:DatabaseBackend',
  26. 'cassandra': 'celery.backends.cassandra:CassandraBackend',
  27. 'couchbase': 'celery.backends.couchbase:CouchBaseBackend',
  28. 'disabled': 'celery.backends.base:DisabledBackend',
  29. }
  30. #: deprecated alias to ``current_app.backend``.
  31. default_backend = Proxy(lambda: current_app.backend)
  32. def get_backend_cls(backend=None, loader=None):
  33. """Get backend class by name/alias"""
  34. backend = backend or 'disabled'
  35. loader = loader or current_app.loader
  36. aliases = dict(BACKEND_ALIASES, **loader.override_backends)
  37. try:
  38. return symbol_by_name(backend, aliases)
  39. except ValueError as exc:
  40. reraise(ValueError, ValueError(UNKNOWN_BACKEND.format(
  41. backend, exc)), sys.exc_info()[2])
  42. def get_backend_by_url(backend=None, loader=None):
  43. url = None
  44. if backend and '://' in backend:
  45. url = backend
  46. if '+' in url[:url.index('://')]:
  47. backend, url = url.split('+', 1)
  48. else:
  49. backend, _, _, _, _, _, _ = _parse_url(url)
  50. return get_backend_cls(backend, loader), url