TrainingPlatform_Django/accounts/views.py
2025-06-03 16:10:11 +08:00

135 lines
3.9 KiB
Python

from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view
import requests
from .models import User
from django.db import IntegrityError
from django.contrib.auth import authenticate
from rest_framework.response import Response
from rest_framework import status
from django.contrib.auth.hashers import check_password
from .tool import generate_token
from .models import UserToken # 确保导入你的 UserToken 模型
from django.utils import timezone
@csrf_exempt
@api_view(['POST'])
def login(request):
email = request.data.get('email')
password = request.data.get('password')
print(f"Attempting to log in with email: {email} and password: {password}")
# 检查用户是否存在
user = User.objects.filter(email=email).first()
if user is None:
print("用户不存在")
return Response({
'success': False,
'message': "用户不存在"
}, status=status.HTTP_404_NOT_FOUND)
print(f"找到用户: {user.username}") # 这里打印找到的用户名
# 直接比较明文密码
if user.password == password:
print("密码验证成功")
# 生成 token
token = generate_token()
# 设置 token 过期时间(例如 1 小时后)
expires_at = timezone.now() + timezone.timedelta(hours=1)
# 检查是否已存在 token
user_token, created = UserToken.objects.update_or_create(
user=user,
defaults={'token': token, 'expires_at': expires_at}
)
if created:
print("创建新的 token")
else:
print("更新现有的 token")
return Response({
'success': True,
'message': "登录成功",
'token': token,
'username': user.username,
'email': user.email
}, status=status.HTTP_200_OK)
else:
print("密码验证失败")
return Response({
'success': False,
'message': "邮箱或密码错误"
}, status=status.HTTP_401_UNAUTHORIZED)
@csrf_exempt
@api_view(['POST'])
def register(request):
username = request.data.get('username')
email = request.data.get('email')
password = request.data.get('password')
user = User(username=username, email=email, password=password)
try:
user.save()
success = True
except IntegrityError as e:
success = False
error_message = str(e) # 获取异常信息
if success:
print(f"用户{username}注册成功")
return JsonResponse({'success': True, 'message': "注册成功"})
else:
if "Duplicate entry" in error_message:
return JsonResponse({'success': False, 'message': "邮箱已被注册"})
return JsonResponse({'success': False, 'message': "注册失败"})
@csrf_exempt
@api_view(['GET'])
def get_user_info(request):
# 从请求头中获取自定义 token
token = request.headers.get('Authorization')
print(token)
if token is None:
return Response({
'success': False,
'message': "未提供 token"
}, status=401)
# 验证 token
try:
user_token = UserToken.objects.get(token=token)
# 检查 token 是否过期
if user_token.expires_at < timezone.now():
return Response({
'success': False,
'message': "Token 已过期"
}, status=401)
# 获取用户信息
user = user_token.user # 通过 token 获取用户对象
return Response({
'success': True,
'username': user.username,
'email': user.email
}, status=200)
except UserToken.DoesNotExist:
return Response({
'success': False,
'message': "无效的 token"
}, status=401)