Python Django:通过社交身份验证创建用户时引发错误时的干预

Python Django:通过社交身份验证创建用户时引发错误时的干预,python,django,django-socialauth,django-1.11,Python,Django,Django Socialauth,Django 1.11,我正在使用软件包social auth app django设置社会身份验证。在未提供电子邮件的情况下尝试创建用户时,我引发了以下值错误 users.py if not email: message = "Ooops, it doesn\'t look like an email was specified. If you are signing in via one of your social media account, please ensure there is

我正在使用软件包social auth app django设置社会身份验证。在未提供电子邮件的情况下尝试创建用户时,我引发了以下值错误

users.py

    if not email:
        message = "Ooops, it doesn\'t look like an email was specified. If you are signing in via one of your social media account, please ensure there is an email address associated to your account."
        raise ValueError(message)
最初,这并不是真的必要,因为我将使用标准表单验证在前端处理表单验证。但是,在集成社交登录时,这会导致一个问题。在开发过程中,这是很好的-但在这个阶段,我想把错误抛回一个错误模板,该模板说他们必须提供一个电子邮件地址。我相信,在Twitter等平台上,用户最初可以注册,而无需与帐户关联的电子邮件地址。这就是我发现这场冲突的地方。本质上,social auth应用程序django在此之前并没有抛出错误-因此,在这一点上,我如何将用户发送回指定的模板,我可以构建该模板,通过上下文将其传回来处理此类错误


通过查看文档,我看不到任何我有信心运行的东西…任何建议都将不胜感激

python social auth模块支持管道-因此,在
settings.py
中的
social_auth_管道
末尾定义一个方法,然后在
pipeline.py
中实现它,可以在用户没有与其社交用户关联的电子邮件的情况下定义所需的行为:

SOCIAL_AUTH_PIPELINE = (
    # any other pipeline handlers ...                                            
    'custom.signup.pipeline.prevent_without_email'
)
然后,在自定义/signup/pipeline.py中,您需要在不使用电子邮件的情况下实现实际的部分for
prevent\u
——您可以在此处看到更多详细信息


如果需要特定的处理程序,可以使用Django signals-在
signals.py
中创建信号,在
pipeline.py
中发出信号,并在未指定电子邮件时让
callbacks.py
中的处理程序处理

您好@dmitryro,我的第一个后续问题-我是否需要指定
社交认证管道中的完整管道?@michael roberts您只需指定那些真正为所需行为添加内容的部分。秩序很重要。每个分部方法都以用户为参数,并有能力决定在不满足某些条件时应做什么,即返回其他用户对象、处理错误或其他任何操作。管道是可选的,但它确实会影响社会身份验证的发生方式。因此,例如,在我开始处理之前,我需要在用户创建等方面指定任何内容,例如,我如何使用经过身份验证的用户的第三方数据来建立他们的个人资料?如果你使用FB或谷歌,你将收到电子邮件,来自这些社交网络的头像和其他相关数据(如果指定了后端并对其进行处理)-以便可以将数据添加到管道中的用户-如果您将该用户标识为合法用户,但他的一些数据仅存在于社交API中(并且它们都不同)-您将基于此协调新认证的用户。如果你需要考虑额外的处理,你可以在信号处理程序中进行(比如发送确认邮件或类似的)。如果需要,你还可以创建一个全新的用户,并将他与这个社交配置文件联系起来。这完全取决于你的管道。