utils.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. # coding=utf-8
  2. from functools import wraps
  3. from django.conf import settings
  4. from django.http import Http404
  5. from social_core.utils import setting_name, module_member, get_strategy
  6. from social_core.exceptions import MissingBackend
  7. from social_core.backends.utils import get_backend
  8. from .compat import reverse
  9. BACKENDS = settings.AUTHENTICATION_BACKENDS
  10. STRATEGY = getattr(settings, setting_name('STRATEGY'),
  11. 'social_django.strategy.DjangoStrategy')
  12. STORAGE = getattr(settings, setting_name('STORAGE'),
  13. 'social_django.models.DjangoStorage')
  14. Strategy = module_member(STRATEGY)
  15. Storage = module_member(STORAGE)
  16. def load_strategy(request=None):
  17. return get_strategy(STRATEGY, STORAGE, request)
  18. def load_backend(strategy, name, redirect_uri):
  19. Backend = get_backend(BACKENDS, name)
  20. return Backend(strategy, redirect_uri)
  21. def psa(redirect_uri=None, load_strategy=load_strategy):
  22. def decorator(func):
  23. @wraps(func)
  24. def wrapper(request, backend, *args, **kwargs):
  25. uri = redirect_uri
  26. if uri and not uri.startswith('/'):
  27. uri = reverse(redirect_uri, args=(backend,))
  28. request.social_strategy = load_strategy(request)
  29. # backward compatibility in attribute name, only if not already
  30. # defined
  31. if not hasattr(request, 'strategy'):
  32. request.strategy = request.social_strategy
  33. try:
  34. request.backend = load_backend(request.social_strategy,
  35. backend, uri)
  36. except MissingBackend:
  37. raise Http404('Backend not found')
  38. return func(request, backend, *args, **kwargs)
  39. return wrapper
  40. return decorator