感谢您的意见和建议。我意识到如何解决我的问题,这是我的解决方案,希望对他人有所帮助。
的第一个问题是,PSA使用两个相同的流水线:
- 注册新用户和
- 登录现有的。
因此,它强制区分一个管道流和另一个管道流。这可以完成(必须完成?)排列查询字符串:
<a href="{% url 'social:begin' 'facebook' %}?register=1">
,用于注册。
<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')
这一切。希望能帮助到你。
为什么不让新用户在不抛出错误的情况下使用Login方法,并在管道检查结束时检查用户是否已经登录或创建,并基于该条件将他重定向到注册表单或应用程序的主页面? – daniula
@daniula问题是:登录和注册的管道都以相同的方式启动,我不知道如何区分登录路径和注册路径。 – Cartucho
流水线会得到一个标志''is_new''来标识,如果你在''create_user''之前添加了一个管道,你可以识别一个注册到该站点的新用户,并且如果你愿意的话可以立即停止这个进程。如果你把你的函数放在''create_user''后面,那么你可以做同样的事情,但用户实例已经被创建了。 – omab