0

招待のみのログインでサイトを作成しようとしています。さらに、招待されたユーザーは、OAuthログイン方法を使用することによってのみサインインできます。

私はDjango1.4を使用しています。

私はアプリgithub.com/lizrice/django-allauthgithub.com/lizrice/django-invitationを使用しています

インストール済みのアプリには、ドキュメントに記載されているすべてのアプリが含まれています。

'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']が入る場所だと思います)。そうでない場合は、アカウントのログインページに移動します。このページから、ソーシャルでサインインするか、新しいユーザー名/pwアカウントを作成できます。

ともかく。reverse('account_login')の呼び出しは、allauth.account.views.loginに解決されるはずです-それがあなたのために起こっていることを確認できますか?簡単に調べてみると、その関数がHttpResponseオブジェクトを返さないことがわからないので、呼び出されているのではないかと思います。

于 2012-09-23T10:56:58.873 に答える