如何使用Python Social-auth从自定义管道中检索存储在会话中的字段

1 投票
1 回答
963 浏览
提问于 2025-04-20 22:14

我的应用程序使用 python social-auth 来进行登录,同时也允许账户进行“连接”。考虑到这一点,我有一个自定义的处理流程,具体如下:

SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.social_details',
'social.pipeline.social_auth.social_uid',
'social.pipeline.social_auth.auth_allowed',
'social.pipeline.social_auth.social_user',
'jdconnections.utils.get_username', #<<here
'social.pipeline.social_auth.associate_by_email', 
'social.pipeline.user.create_user',
'social.pipeline.social_auth.associate_user',
'social.pipeline.social_auth.load_extra_data',
'social.pipeline.user.user_details'
)

我还设置了:

SOCIAL_AUTH_FIELDS_STORED_IN_SESSION = ['connection',] 

在我的应用视图中,我这样调用 social-auth,比如说用于 Twitter:

  return HttpResponseRedirect(reverse('social:begin', args=('twitter',)) + "?connection=" + request.POST.get('origin') )

这个过程运行得很好,我去 Twitter 完成了认证,但当我回到我的自定义处理流程时,我无法获取会话值,我现在的做法是:

from django.conf import settings
from django.contrib.sessions.backends.db import SessionStore
from jdconnections.models import Connections

from social.pipeline.user import get_username as social_get_username

def get_username(strategy, details, user=None, *args, **kwargs):

   current_session = SessionStore()
   if 'connection' not in current_session:
      result = social_get_username(strategy, details, user=user, *args, **kwargs)   
      return result
   else:
    if current_session['connection'] == 'TW':
        social = user.social_auth.get(provider='twitter')
        access_token = social.extra_data['access_token']
        cn = Connections.objects.create(origin='TW',ctoken = access_token)
    return None

通过 PDB 和 django 调试工具,我可以看到这个值是存在的,那么这段代码有什么问题,为什么无法获取到它呢?感谢任何帮助!

1 个回答

1

根据文档,获取数据的正确方法是:

strategy.session_get('connection')

这或许对你有帮助?

可以查看 http://psa.matiasaguirre.net/docs/use_cases.html#pass-custom-get-post-parameters-and-retrieve-them-on-authentication

撰写回答