backends.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. # -*- coding: utf-8 -*-
  2. """Backend selection."""
  3. from __future__ import absolute_import, unicode_literals
  4. import sys
  5. import types
  6. from celery._state import current_app
  7. from celery.exceptions import ImproperlyConfigured
  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. 'sentinel': 'celery.backends.redis:SentinelBackend',
  20. 'mongodb': 'celery.backends.mongodb:MongoBackend',
  21. 'db': 'celery.backends.database:DatabaseBackend',
  22. 'database': 'celery.backends.database:DatabaseBackend',
  23. 'elasticsearch': 'celery.backends.elasticsearch:ElasticsearchBackend',
  24. 'cassandra': 'celery.backends.cassandra:CassandraBackend',
  25. 'couchbase': 'celery.backends.couchbase:CouchbaseBackend',
  26. 'couchdb': 'celery.backends.couchdb:CouchBackend',
  27. 'riak': 'celery.backends.riak:RiakBackend',
  28. 'file': 'celery.backends.filesystem:FilesystemBackend',
  29. 'disabled': 'celery.backends.base:DisabledBackend',
  30. 'consul': 'celery.backends.consul:ConsulBackend',
  31. 'dynamodb': 'celery.backends.dynamodb:DynamoDBBackend',
  32. }
  33. def by_name(backend=None, loader=None,
  34. extension_namespace='celery.result_backends'):
  35. """Get backend class by name/alias."""
  36. backend = backend or 'disabled'
  37. loader = loader or current_app.loader
  38. aliases = dict(BACKEND_ALIASES, **loader.override_backends)
  39. aliases.update(
  40. load_extension_class_names(extension_namespace) or {})
  41. try:
  42. cls = symbol_by_name(backend, aliases)
  43. except ValueError as exc:
  44. reraise(ImproperlyConfigured, ImproperlyConfigured(
  45. UNKNOWN_BACKEND.strip().format(backend, exc)), sys.exc_info()[2])
  46. if isinstance(cls, types.ModuleType):
  47. raise ImproperlyConfigured(UNKNOWN_BACKEND.strip().format(
  48. backend, 'is a Python module, not a backend class.'))
  49. return cls
  50. def by_url(backend=None, loader=None):
  51. """Get backend class by URL."""
  52. url = None
  53. if backend and '://' in backend:
  54. url = backend
  55. scheme, _, _ = url.partition('://')
  56. if '+' in scheme:
  57. backend, url = url.split('+', 1)
  58. else:
  59. backend = scheme
  60. return by_name(backend, loader), url