0

我正在使用PythonSocialAuth (v0.1.23),我需要将“注册”(创建新用户帐户)与登录区分开来。在PSA Django 示例中,如果新用户尝试登录,管道逻辑会将新用户重定向到“注册表单”;我想避免这种“登录或注册”行为。

我需要的是:

  1. 如果新用户尝试登录,则会引发错误。
  2. 强制新用户注册以创建新帐户/个人资料。

知道如何操纵 PSA 管道以实现此目的吗?(我使用的是 Django 1.6)。

提前致谢。

4

1 回答 1

0

感谢您的意见和建议。我意识到如何解决我的问题,这是我的解决方案,希望对其他人有所帮助。

第一个问题是 PSA 对两者使用相同的管道:

  1. 注册新用户和
  2. 登录现有的。

因此,必须将一个管道流与另一个管道流区分开来。这可以完成(必须完成?)安排查询字符串:

  1. <a href="{% url 'social:begin' 'facebook' %}?register=1">, 用于注册。
  2. <a href="{% url 'social:begin' 'facebook' %}">, 用于常规登录。

第二个问题是如何读取registerPSA管道中的参数。此任务必须完成设置FIELDS_STORED_IN_SESSION(请参阅PSA 文档):

# settings.py
...
FIELDS_STORED_IN_SESSION = ['register']

最后,我的管道如下所示:

# settings.py
...
SOCIAL_AUTH_PIPELINE = (
    'my.path.custom_pipeline.clean_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',
    'my.path.custom_pipeline.redirect_to_join_form',
    ... 
)

还有我的自定义任务:

# custom_pipeline.py

from social.pipeline.partial import partial
from django.contrib import messages
from django.shortcuts import redirect

def clean_pipeline(strategy, *args, **kwargs):
        _register = strategy.session.get('register', None)
        strategy.session.flush()
        strategy.session['register'] = _register

@partial
def redirect_to_join_form(strategy, details, user=None, is_new=False, *args, **kwargs):
    if user and user.username:
        return
    if is_new and strategy.session_get('register', False) == '1':
        strategy.session.pop('register')
        return redirect('users_join_form')
    if is_new and strategy.session_get('saved_username'):
        return {'username': strategy.session_get('saved_username')}
    messages.add_message(
        strategy.request, messages.ERROR,
        "Error. Account not registered %s (%s), " % 
        (strategy.backend.name.capitalize(), details['username'])
    )
    return redirect('users_login')

就这样。希望能帮助到你。

于 2014-05-17T05:40:26.240 回答