Клиент не создается для пользователя при попытке войти в систему с помощью google
Для моего сайта все в порядке, если я регистрируюсь, а затем вхожу в систему. Но когда я пытаюсь войти в систему с помощью google, объекты Customer не удается создать. Поэтому я обнаружил ошибку, что у пользователя нет клиента. Вот моя модель представления для клиента:
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name = 'customer', null=True, blank=True)
Я пытался реализовать создание клиента, но, похоже, никакого эффекта. вот мой views.py:
def google_login(request):
redirect_uri = "http://127.0.0.1:8000/accounts/google/login/callback/" % (
request.scheme, request.get_host(), reverse('pain:google_login')
)
if('code' in request.GET):
params = {
'grant_type': 'authorization_code',
'code': request.GET.get('code'),
'redirect_uri': redirect_uri,
'client_id': settings.GP_CLIENT_ID,
'client_secret': settings.GP_CLIENT_SECRET
}
url = 'https://accounts.google.com/o/oauth2/token'
response = request.post(url, data=params)
url = 'https://www.googleapis.com/oauth2/v1/userinfo'
access_token = response.json().get('access_token')
response = request.get(url, params={'access_token': access_token})
user_data = response.json()
email = user_data.get('email')
if email:
user, _ = User.objects.get_or_create(email=email, username=email)
Customer.objects.get_or_create(email=email, username=email)
gender = user_data.get('gender', '').lower()
if gender == 'male':
gender = 'M'
elif gender == 'female':
gender = 'F'
else:
gender = 'O'
data = {
'first_name': user_data.get('name', '').split()[0],
'last_name': user_data.get('family_name'),
'google_avatar': user_data.get('picture'),
'gender': gender,
'is_active': True
}
user.__dict__.update(data)
user.save()
user.backend = settings.AUTHENTICATION_BACKENDS[0]
login(request, user)
else:
messages.error(
request,
'Unable to login with Gmail Please try again'
)
return redirect('/')
else:
url = "https://accounts.google.com/o/oauth2/auth?client_id=%s&response_type=code&scope=%s&redirect_uri=%s&state=google"
scope = [
"https://www.googleapis.com/auth/userinfo.profile",
"https://www.googleapis.com/auth/userinfo.email"
]
scope = " ".join(scope)
url = url % (settings.GP_CLIENT_ID, scope, redirect_uri)
return redirect(url)