psa装饰器的目的是什么?我们如何使用它?

时间:2015-02-20 10:27:39

标签: django python-social-auth

我在Django项目中使用python-social-auth几周。现在我已经达到了我需要从视图中验证用户的位置(即,不是通过social:begin等模板标记)和the documentation使用来自psa()装饰器的social.apps.django_app.utils

我无法找到任何清楚解释psa装饰者应该做什么的内容,omab/python-social-auth的来源不提供任何评论。

任何人都可以解释:

  1. psa装饰师究竟应该做什么?
  2. 当我使用它根据前端检索的访问令牌(可能来自Facebook等任何社交网络)对用户进行身份验证时,会发生什么?

1 个答案:

答案 0 :(得分:1)

这里是psa的代码(来自here):

def psa(redirect_uri=None, load_strategy=load_strategy):
def decorator(func):
    @wraps(func)
    def wrapper(request, backend, *args, **kwargs):
        uri = redirect_uri
        if uri and not uri.startswith('/'):
            uri = reverse(redirect_uri, args=(backend,))
        request.social_strategy = load_strategy(request)
        # backward compatibility in attribute name, only if not already
        # defined
        if not hasattr(request, 'strategy'):
            request.strategy = request.social_strategy

        try:
            request.backend = load_backend(request.social_strategy,
                                           backend, uri)
        except MissingBackend:
            raise Http404('Backend not found')
        return func(request, backend, *args, **kwargs)
    return wrapper
return decorator

作为装饰者,它增强了它装饰的功能。

它做了三件事:

  1. 设置request.social_strategy(此对象是特定于框架的,例如Django)。
  2. 根据传入的后端字符串参数设置request.backend(此对象特定于授权后端,例如Facebook)(例如," facebook")。
  3. 提供重定向URI或URI名称(然后"反转"获取URI)并将URI传递给后端,以便知道何时重定向到哪里。
  4. 装饰函数可以方便地访问request.social_strategy和request.backend,并知道它们将被设置。有关StrategyBackend的用途的详情,请参阅Python Social Auth文档。