请求返回200 OK状态但Postman提示登录失败错误排查求助
嘿,咱们一步步拆解你遇到的问题:请求明明返回了200 OK状态码,但响应体却提示登录失败,这确实有点绕人,咱们从后端代码和请求配置两方面找原因:
先明确当前的错误表现
你的请求返回200状态,但响应体内容是:
{ "errors": "Unable to log you in, please try again.", "success": false }
从后端代码找核心问题
看你提供的Django视图函数token_new,有几个关键的地方需要检查:
1. JSON请求体没被正确解析
你的请求头设置了Content-Type: application/json,但视图里却用request.POST.get()来获取参数——Django的request.POST只处理表单编码(application/x-www-form-urlencoded或multipart/form-data)的请求体,如果是JSON格式的请求,request.POST会是空的!
这就会导致email = request.POST.get('username')拿到None,接着执行CognitoUser.objects.get(user__email=email)时抛出异常,直接进入except分支返回登录失败的错误;就算侥幸过了这一步,后面password = request.POST.get('password')也拿不到值,最终还是会触发登录失败的响应。
修复方案:改成解析JSON请求体,代码调整如下:
import json @csrf_exempt def token_new(request): if request.method == 'POST': # 先解析JSON格式的请求体 try: request_data = json.loads(request.body) except json.JSONDecodeError: return JsonError("Invalid JSON format in request body.") # 从解析后的JSON数据里拿参数 email = request_data.get('username') print(email) # 后续逻辑保持不变...
2. 错误响应的状态码没正确设置
你用了JsonResponseUnauthorized这类自定义响应类,要确认它有没有设置正确的HTTP状态码(比如401)。如果你的自定义类只是继承了JsonResponse但没指定status参数,那默认会返回200状态码,这就会出现“200 OK但内容是错误”的矛盾情况。
检查建议:查看JsonResponseUnauthorized的实现,确保它设置了status=401,比如:
class JsonResponseUnauthorized(JsonResponse): def __init__(self, message, **kwargs): super().__init__({'errors': message, 'success': False}, status=401, **kwargs)
3. 加日志定位具体失败环节
在关键步骤加日志,能帮你精准定位到底是哪一步出了问题:
- 在拿到
email后打印日志,确认是否正确获取到了前端传的用户名 - 在
try-except块里捕获具体异常信息,而不是直接返回通用错误,比如:
except Exception as e: print(f"Error when fetching CognitoUser: {str(e)}") # 打印具体异常到日志 return JsonResponseUnauthorized("Unable to log you in, please try again.")
- 在
authenticate前后打印username和password,确认参数是否正确传递
前端请求额外检查
确认前端发送的请求体是标准的JSON格式,并且包含username和password字段,比如:
{ "username": "your-email@example.com", "password": "your-login-password" }
总结下来,最可能的原因是JSON请求体没被后端正确解析,导致拿不到用户名密码触发错误,同时错误响应的状态码没设置成401,所以返回了200,先从解析JSON请求体这一步改起,应该能解决大部分问题。
内容的提问来源于stack exchange,提问作者Prabhu Hiremath

