Django REST Framework出现'NoneType' object is not subscriptable报错如何解决
核心问题说明
报错触发的位置是process_payment函数内的link=response['data']['link']这行,说明你调用外部接口拿到的response是None,不存在['data']属性,和你猜想的cleaned_data没有直接关联。
具体修复步骤
- 第一步:补全
process_payment函数的请求异常判断,避免接口调用失败时返回空值:
# 你的process_payment函数修改示例 import requests def process_payment(name, email, amount, phone): try: # 替换为你实际的支付接口请求逻辑 resp = requests.post( "支付接口URL", json={"name": name, "email": email, "amount": amount, "phone": phone}, timeout=10 ) # 先判断请求状态码正常再解析返回值 if resp.status_code == 200: resp_json = resp.json() # 多级取值用get避免KeyError return resp_json.get("data", {}).get("link") except Exception as e: # 可自行添加日志打印错误原因排查问题 print(f"支付接口调用失败: {str(e)}") return None
- 第二步:如果你需要实现类似Django Form中
cleaned_data的参数校验能力,在DRF中使用序列化器完成即可,同时可以避免参数缺失导致的支付接口调用失败:
首先定义参数校验序列化器:
from rest_framework import serializers class PaymentParamsSerializer(serializers.Serializer): name = serializers.CharField(required=True, max_length=100) email = serializers.EmailField(required=True) amount = serializers.DecimalField(required=True, max_digits=10, decimal_places=2) phone = serializers.CharField(required=True, max_length=11)
然后修改你的视图逻辑:
@api_view(['GET', "POST"]) def home(request): if request.method == 'POST': ser = PaymentParamsSerializer(data=request.data) # 校验不通过直接返回400错误,无需后续执行 ser.is_valid(raise_exception=True) # ser.validated_data就是校验后的安全参数,等价于你说的cleaned_data params = ser.validated_data payment_link = process_payment(**params) if not payment_link: return Response({"error": "支付链接生成失败"}, status=500) return redirect(str(payment_link)) else: return Response({"Homepage": "Payment"})
- 第三步:如果还是存在问题,可以在调用
process_payment前打印传入的四个参数,确认参数符合支付接口的要求,排除参数传错导致的接口返回异常。
内容的提问来源于stack exchange,提问作者Oladipo
相关产品推荐
相关产品推荐

