backends.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # -*- coding: utf-8 -*-
  2. """Backend selection."""
  3. from __future__ import absolute_import, unicode_literals
  4. import sys
  5. import types
  6. from celery.exceptions import ImproperlyConfigured
  7. from celery._state import current_app
  8. from celery.five import reraise
  9. from celery.utils.imports import load_extension_class_names, symbol_by_name
  10. __all__ = ('by_name', 'by_url')
  11. UNKNOWN_BACKEND = """
  12. Unknown result backend: {0!r}. Did you spell that correctly? ({1!r})
  13. """
  14. BACKEND_ALIASES = {
  15. 'amqp': 'celery.backends.amqp:AMQPBackend',
  16. 'rpc': 'celery.backends.rpc.RPCBackend',
  17. 'cache': 'celery.backends.cache:CacheBackend',
  18. 'redis': 'celery.backends.redis:RedisBackend',
  19. 'mongodb': 'celery.backends.mongodb:MongoBackend',
  20. 'db': 'celery.backends.database:DatabaseBackend',
  21. 'database': 'celery.backends.database:DatabaseBackend',
  22. 'elasticsearch': 'celery.backends.elasticsearch:ElasticsearchBackend',
  23. 'cassandra': 'celery.backends.cassandra:CassandraBackend',
  24. 'couchbase': 'celery.backends.couchbase:CouchbaseBackend',
  25. 'couchdb': 'celery.backends.couchdb:CouchBackend',
  26. 'riak': 'celery.backends.riak:RiakBackend',
  27. 'file': 'celery.backends.filesystem:FilesystemBackend',
  28. 'disabled': 'celery.backends.base:DisabledBackend',
  29. 'consul': 'celery.backends.consul:ConsulBackend',
  30. 'dynamodb': 'celery.backends.dynamodb:DynamoDBBackend',
  31. }
  32. def by_name(backend=None, loader=None,
  33. extension_namespace='celery.result_backends'):
  34. """Get backend class by name/alias."""
  35. backend = backend or 'disabled'
  36. loader = loader or current_app.loader
  37. aliases = dict(BACKEND_ALIASES, **loader.override_backends)
  38. aliases.update(
  39. load_extension_class_names(extension_namespace) or {})
  40. try:
  41. cls = symbol_by_name(backend, aliases)
  42. except ValueError as exc:
  43. reraise(ImproperlyConfigured, ImproperlyConfigured(
  44. UNKNOWN_BACKEND.strip().format(backend, exc)), sys.exc_info()[2])
  45. if isinstance(cls, types.ModuleType):
  46. raise ImproperlyConfigured(UNKNOWN_BACKEND.strip().format(
  47. backend, 'is a Python module, not a backend class.'))
  48. return cls
  49. def by_url(backend=None, loader=None):
  50. """Get backend class by URL."""
  51. url = None
  52. if backend and '://' in backend:
  53. url = backend
  54. scheme, _, _ = url.partition('://')
  55. if '+' in scheme:
  56. backend, url = url.split('+', 1)
  57. else:
  58. backend = scheme
  59. return by_name(backend, loader), url