You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:04:32