DRF接口网页显示数据但Jupyter测试返回Not found的问题排查
问题分析与修复方案
核心问题1:未登录请求下的用户查询逻辑错误
当权限设为AllowAny时,Jupyter发起的requests.get是未登录状态,此时request.user是AnonymousUser对象。你用get_object_or_404(User, username=request.user)查询用户,会尝试匹配username='AnonymousUser'的用户,而数据库中不存在该用户,因此直接返回404(Not found)。网页端能正常访问,是因为你在网页端已登录,request.user是真实存在的用户对象。
核心问题2:序列化器模型不匹配(潜在错误)
ItemSerializer的元类中指定model=Workout,但实际序列化的是Item对象,这会导致序列化逻辑冲突,网页端可能因场景巧合暂时未暴露问题,但长期会引发报错。
修复步骤
1. 调整视图的用户查询逻辑
根据业务需求二选一:
需求:仅登录用户可查看自己的Item
权限保持IsAuthenticated,简化用户查询逻辑(登录后request.user即为当前用户对象):@api_view(['GET']) @permission_classes([IsAuthenticated]) def getItem(request, **kwargs): items = Item.objects.filter(user=request.user) serializer = ItemSerializer(items, many=True) return Response(serializer.data)Jupyter测试时需携带认证凭证(以Session认证为例):
import requests # 先登录获取会话 session = requests.Session() session.post("http://你的域名/api/login/", data={"username": "你的用户名", "password": "你的密码"}) # 用会话请求目标接口 data = session.get(URL) json_data = data.json() print(json_data)需求:允许未登录用户查看指定用户的Item
先修改URL配置,添加用户名参数:path('api/<str:username>/items/', views.getItem),
再修改视图逻辑,通过URL参数获取用户名:@api_view(['GET']) @permission_classes([AllowAny]) def getItem(request, username, **kwargs): user = get_object_or_404(User, username=username) items = Item.objects.filter(user=user) serializer = ItemSerializer(items, many=True) return Response(serializer.data)Jupyter测试时URL需带上目标用户名,比如
URL = "http://你的域名/api/Shiko/items/"
2. 修正序列化器的模型匹配
将ItemSerializer元类中的model改为Item:
class ItemSerializer(serializers.ModelSerializer): user = serializers.CharField(source="user.username", read_only=True) class Meta: model = Item fields = '__all__'
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

