from django.dispatch import receiver from allauth.account.signals import user_logged_in from allauth.socialaccount.models import SocialAccount from .models import User, UserSource @receiver(user_logged_in) def user_logged_in_handler(request, user, **kwargs): print('信号处理开始: user_logged_in_handler 被触发') # 防止信号被重复处理 if hasattr(request, '_google_user_logged_in_handled'): print('重复信号,跳过处理') return request._google_user_logged_in_handled = True print('处理信号标志设置完成') try: social_account = SocialAccount.objects.get(user=user, provider='google') print(f'找到 social_account,用户ID: {user.id}') google_id = social_account.extra_data.get('sub') email = social_account.extra_data.get('email') username = social_account.extra_data.get('name') print(f'从 social_account 获取的 google_id: {google_id}, email: {email}, username: {username}') if not google_id: # 如果 google_id 为空,不要继续创建用户,记录日志或处理错误 print('google_id 为空,终止处理') return # 优化:根据 google_id 和 email 双重检查用户是否已存在 try: custom_user = User.objects.get(google_id=google_id) print(f'根据 google_id 找到用户: {custom_user.username}') except User.DoesNotExist: print(f'没有找到 google_id 为 {google_id} 的用户,检查 email: {email}') # 进一步检查是否有相同的 email 用户存在 if User.objects.filter(email=email).exists(): custom_user = User.objects.get(email=email) print(f'找到 email 为 {email} 的用户: {custom_user.username}') # 如果用户存在但 google_id 不同,更新 google_id custom_user.google_id = google_id custom_user.save() print(f'更新用户的 google_id 为: {google_id}') else: custom_user = User.objects.create( username=username, email=email, google_id=google_id, # password_hash='', # Google 登录不需要密码 ) print(f'创建新用户: {custom_user.username},google_id: {google_id}') UserSource.objects.create(user=custom_user, source='Google') print(f'创建 UserSource 记录,来源为 Google') x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[0] # 可能有多个 IP 地址,取第一个 else: ip = request.META.get('REMOTE_ADDR') # 使用 REMOTE_ADDR 作为备用 # 更新登录次数和 IP 地址 custom_user.login_count += 1 custom_user.last_login_ip = ip custom_user.save() print(f'更新用户信息: 登录次数 {custom_user.login_count}, IP 地址 {custom_user.last_login_ip}') except SocialAccount.DoesNotExist: print('未找到与用户关联的 Google social_account')