私の最初はDjango/pythonが初めてです。
ユーザーがアカウントを登録してメールで確認するか、fbまたはgoogle(Oauth)で直接ログインできるログインWebサイトを作成しようとしています。
電子メールに送信された検証URLをクリックすると、エラーが表示されます。
エラー:
ValueError at /activate/Mjk/4p1-dcc5f7ed2e7c847fe362/
You have multiple authentication backends configured and therefore must
provide the `backend` argument or set the `backend` attribute on the user.
Request Method: GET
Request URL: http://127.0.0.1:8000/activate/Mjk/4p1-dcc5f7ed2e7c847fe362/
Django Version: 1.11.3
Exception Type: ValueError
Exception Value:
You have multiple authentication backends configured and therefore must provide the `backend` argument or set the `backend` attribute on the user.
Exception Location: /usr/local/lib/python2.7/dist-packages/Django/contrib/auth/__init__.py in login, line 149
Python Executable: /usr/bin/python
Python Version: 2.7.12
Python Path:
['/home/gaby/Django projects/simple-signup-master/profile-model',
'/usr/local/lib/python2.7/dist-packages/virtualenv-15.1.0-py2.7.Egg',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/home/gaby/.local/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
Server time: Wed, 30 Aug 2017 12:34:31 +0000
AUTHENTICATION_BACKENDS =(
'social_core.backends.facebook.FacebookOAuth2',
'social_core.backends.google.GoogleOAuth2',
'Django.contrib.auth.backends.ModelBackend',
)
def activate(request, uidb64, token):
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user,
token):
user.is_active = True
user.profile.email_confirmed = True
user.save()
login(request, user)
return redirect('home')
else:
return render(request, 'account_activation_invalid.html')
fb、googleで宣誓ログインを追加した後、エラーが表示され始めました。 AUTHENTICATION_BACKENDSから「social_core.backends.facebook.FacebookOAuth2」、「social_core.backends.google.GoogleOAuth2」を削除すると、確認メールが再び機能します。
私はオンラインで検索し、ここで見つけた唯一の解決策は以下でしたが、それは私の問題を解決しませんでした。
私は解決策を見つけました。関数にバックエンドを追加する必要がありました。
def activate(request, uidb64, token, backend='Django.contrib.auth.backends.ModelBackend'):
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.profile.email_confirmed = True
user.save()
login(request, user, backend='Django.contrib.auth.backends.ModelBackend')
return redirect('home')
else:
return render(request, 'account_activation_invalid.html')
したがって、私の場合、ユーザーを登録していませんでした。 login(request, user, backend='Django.contrib.auth.backends.ModelBackend')
もしました
ユーザーを登録するには:
# register.py
from Django.contrib.auth.models import User
cfg_user = 'user'
user = User.objects.create_user(username=cfg_user,
email='[email protected]',
password='password')
print('registered user '+cfg_user)
# register.sh
python manage.py Shell < register.py
Django class PasswordResetConfirmViewでビルドを使用している場合は、以下を追加して修正できます。
post_reset_login_backend = "Django.contrib.auth.backends.RemoteUserBackend"
そのようなもの:
from Django.contrib.auth import views
class PasswordResetConfirmView(views.PasswordResetConfirmView):
template_name = "reset_confirm.html"
success_url = "/"
post_reset_login = True
post_reset_login_backend = "Django.contrib.auth.backends.RemoteUserBackend"
私の場合は、Django設定からバックエンドクラスのいくつかをユーザーに正しく割り当てるだけで適切に動作します:
setattr(user, 'backend', 'Django.contrib.auth.backends.RemoteUserBackend')
そして、あなたはあなたのユーザーを認証することができます