2014-05-08 151 views
0

我正在使用PythonSocialAuth(v0.1.23),我需要从登录中区分“注册”(创建一个新的用户帐户)。在PSA Django example中,如果新用户尝试登录,流水线逻辑会将新用户重定向到“注册表单”;我想避免这种“登录或注册”行为。登录和注册PythonSocialAuth

我需要的是:

  1. 如果用户试图登录引发错误。
  2. 强制新用户注册以创建新帐户/配置文件。

任何想法如何操纵PSA流水线来完成这个任务? (我使用的是Django 1.6)。

在此先感谢。

+0

为什么不让新用户在不抛出错误的情况下使用Login方法,并在管道检查结束时检查用户是否已经登录或创建,并基于该条件将他重定向到注册表单或应用程序的主页面? – daniula

+0

@daniula问题是:登录和注册的管道都以相同的方式启动,我不知道如何区分登录路径和注册路径。 – Cartucho

+0

流水线会得到一个标志''is_new''来标识,如果你在''create_user''之前添加了一个管道,你可以识别一个注册到该站点的新用户,并且如果你愿意的话可以立即停止这个进程。如果你把你的函数放在''create_user''后面,那么你可以做同样的事情,但用户实例已经被创建了。 – omab

回答

0

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

的第一个问题是,PSA使用两个相同的流水线:

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

因此,它强制区分一个管道流和另一个管道流。这可以完成(必须完成?)排列查询字符串:

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

第二个问题是如何读取PSA管道中的register参数。这个任务必须完成设置FIELDS_STORED_IN_SESSION(见PSA docs):

# 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') 

这一切。希望能帮助到你。