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

Django REST API测试:用户列表返回200但详情返回404问题排查

解决测试中用户详情视图返回404的问题

我遇到过类似的情况,你的问题大概率出在测试请求的URL不正确或者硬编码用户ID这两个点上,我们一步步排查:

1. 避免硬编码用户ID,使用测试用户的实际ID

你在测试里硬编码了args=(1,)来生成详情URL,但测试环境的数据库是每次测试都会重置的——虽然理论上第一个创建的用户ID是1,但有时候因为测试执行顺序、数据库配置等原因可能会有偏差(比如某些测试用例提前创建了用户又删除)。更稳妥的方式是直接使用测试用户的实际ID:

修改你的测试方法:

def test_authenticated_user_can_get_users_detail(self):
    self.client.force_authenticate(user=self.test_user)
    # 使用测试用户的实际ID,而不是硬编码1
    user_detail_url = reverse('users-detail', args=(self.test_user.id,))
    print(f"请求URL: {user_detail_url}")
    print(f"测试用户ID: {self.test_user.id}")
    response = self.client.get(user_detail_url, format='json')
    print(f"响应内容: {response.content}")
    self.assertEqual(response.status_code, status.HTTP_200_OK)

这样可以确保你请求的是当前测试中确实存在的用户的详情页。

2. 验证测试中生成的URL是否与实际运行的一致

你提到运行python manage.py runserver时访问/api/users/:id/正常,但测试里的reverse可能没有生成带/api前缀的URL。比如:

  • 如果你的主urls.py配置是把API路由挂载在/api/路径下:
    # urls.py (项目根目录)
    from django.urls import path, include
    from rest_framework.routers import DefaultRouter
    from users.views import UserViewSet
    
    router = DefaultRouter()
    router.register(r'users', UserViewSet)
    
    urlpatterns = [
        path('api/', include(router.urls)),
    ]
    
    那么reverse('users-detail')应该生成/api/users/1/,但如果你的测试环境没有正确识别这个前缀(比如路由命名空间问题),就会生成/users/1/,导致请求不存在的端点返回404。

解决URL前缀问题的方法:

  • 先打印user_detail_url查看实际生成的URL,确认是否包含/api前缀。
  • 如果确实缺少前缀,可以在测试中手动添加:
    user_detail_url = f"/api{reverse('users-detail', args=(self.test_user.id,))}"
    
  • 或者给API路由添加命名空间,确保reverse生成正确的URL:
    # urls.py (项目根目录)
    urlpatterns = [
        path('api/', include(('users.urls', 'users'), namespace='users')),
    ]
    
    然后测试里用命名空间reverse:
    user_detail_url = reverse('users:users-detail', args=(self.test_user.id,))
    

3. 额外排查点

  • 检查setup_user函数:你调用了create_user后又调用了save(),其实create_user方法已经会自动保存用户到数据库,这一步多余但不会导致问题,不过可以删掉test_user.save()简化代码。
  • 查看响应内容:打印response.content可以看到具体的错误信息,比如是否是"Not found"还是权限问题,帮助进一步定位。

按照上面的步骤修改后,你的测试应该就能正常返回200了。

内容的提问来源于stack exchange,提问作者Just trying

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:44:06