0

我正在尝试创建一个仅邀请登录的站点。此外,受邀用户只能使用某些 OAuth 登录方法登录。

我正在使用 Django 1.4。

我正在使用应用程序github.com/lizrice/django-allauthgithub.com/lizrice/django-invitation

在 installed_apps 我已经包含了文档告诉我包含的所有应用程序:

'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.google',
'invitation',

我在 settings.py 中设置了几个变量:

SOCIALACCOUNT_AUTO_SIGNUP = False
SOCIALACCOUNT_ENABLED = True
INVITE_MODE = True
ACCOUNT_INVITATION_DAYS = 10
INVITATIONS_PER_USER = 1
INVITATION_USE_ALLAUTH = True

在 urls.py 我只需要 url

url(r'^accounts/register/$', register,
        {
            'backend': 'invitation.backends.InvitationBackend',
        },
    name='registration_register'),
(r'^accounts/', include('invitation.urls')),
(r'^accounts/', include('allauth.urls')),

我可以创建一个邀请码,并使用该邀请码进行注册。现在,注册视图显示以下错误(完整的Stacktrace):

The view invitation.views.register didn't return an HttpResponse object.

注册视图应显示注册流程,用户可以在其中选择 OAuth 提供者来创建帐户。

编辑:使用我的配置,错误来自 allauth/socialaccount/views.py

def signup(request, **kwargs):
    if request.user.is_authenticated():
        return HttpResponseRedirect(reverse(connections))
    sociallogin = request.session.get('socialaccount_sociallogin')
    if not sociallogin:
        return HttpResponseRedirect(reverse('account_login'))

没有具有该名称的会话项,因此代码尝试反转为“account_login”。此 URL 在 allauth 中定义。Allauth 在 installed_apps 列表中,并且包含 url。

编辑:添加堆栈跟踪

编辑:删除注册,不需要。

4

1 回答 1

1

我的这段代码很可能有缺陷:-) 但让我们看看我们是否能深入了解它。另外,请注意pennersr 提出了一种更好的方法来做到这一点,但我还没有机会实现它。

这样做的想法是,除非人们拥有有效的邀请码,否则您不会让他们注册新帐户 - 但如果他们要通过社交帐户登录,您将无法判断他们是否现有用户或新用户,直到他们已经登录。如果结果证明他们是新用户,我们会告诉他们他们需要邀请密钥。时间流逝,他们以某种方式获得邀请密钥并返回您的站点并输入它。如果他们碰巧在同一个会话中,他们仍然会以社交方式登录(我认为这就是 request.session['socialaccount_sociallogin'] 的作用)。如果没有,他们将转到帐户登录页面,他们可以从该页面进行社交登录或创建新的用户名/密码帐户。

反正。我相信,对 reverse('account_login') 的调用应该解析为 allauth.account.views.login - 你能检查一下你的情况吗?在快速检查中,我看不出该函数如何不会返回 HttpResponse 对象,所以我想知道它是否被调用了。

于 2012-09-23T10:56:58.873 回答