使用Redux+Django时点击产品跳转出现500错误求助
问题排查与解决
核心问题分析
你的500错误大概率出在views.py的getProduct函数里,主要有两个可能的原因:
1. 主键字段不匹配
Django模型默认主键字段是id,如果你的Product模型没有手动将主键设置为_id,那么Product.objects.get(_id=pk)会因为字段不存在抛出错误,直接触发500响应。
2. 未捕获对象不存在异常
即使主键字段正确,当请求的产品ID在数据库中不存在时,get()方法会抛出Product.DoesNotExist异常,同样会导致500错误,因为没有对异常进行处理。
修改后的views.py代码
from django.shortcuts import render from django.http import JsonResponse from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status # 新增:用于返回标准状态码 from .models import Product from .products import products from .serializers import ProductSerializer # Create your views here. @api_view(['GET']) def getRoutes(request): routes = [ '/api/products/', '/api/products/create/', '/api/products/upload/', '/api/products/<id>/reviews/', '/api/products/top/', '/api/products/<id>', '/api/products/delete/<id>/', '/api/products/<update>/<id>/' ] return Response(routes) @api_view(['GET']) def getProducts(request): products = Product.objects.all() serializer = ProductSerializer(products, many=True) return Response(serializer.data) @api_view(['GET']) def getProduct(request, pk): try: # 若模型默认主键为id则使用此写法,若自定义了_id为主键则改回_id=pk product = Product.objects.get(id=pk) serializer = ProductSerializer(product, many=False) return Response(serializer.data) except Product.DoesNotExist: # 捕获不存在异常,返回404状态码和明确错误信息 return Response({"detail": "产品不存在"}, status=status.HTTP_404_NOT_FOUND)
额外检查项
- 确认
Product模型结构:如果确实自定义了主键为_id,保持_id=pk即可,但需确保模型中有该字段定义,示例:class Product(models.Model): _id = models.AutoField(primary_key=True) # 其他业务字段... - 前端会自动捕获后端返回的错误信息,在页面上显示对应提示,无需修改前端代码。
内容的提问来源于stack exchange,提问作者ngc918
相关产品推荐
相关产品推荐

