Django REST Framework接口404报错:/api/posts路径无法访问
问题分析与解决
核心问题:URL路径不匹配
你桌面端请求的是http://127.0.0.1:8000/api/posts,但后端urls.py中通过router.register(r'posts', PostViewSet)注册的接口路径是根路径下的/posts/(DefaultRouter会自动添加尾斜杠),并不存在/api/posts这个路径,所以返回404。
解决方案:统一API路径前缀
有两种方式修复:
方式1:修改后端URL配置(推荐)
给所有DRF接口加上api/前缀,修改urls.py:
from django.urls import path, include from .views import ThreadListView, ThreadDetailView, CreateThreadView, CreatePostView, PostViewSet from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r'posts', PostViewSet) urlpatterns = [ path('', ThreadListView.as_view(), name='thread_list'), path('thread/<int:pk>/', ThreadDetailView.as_view(), name='thread_detail'), path('thread/create/', CreateThreadView.as_view(), name='create_thread'), path('thread/<int:pk>/post/', CreatePostView.as_view(), name='create_post'), path('accounts/', include('accounts.urls')), # 把router的接口包含在api/前缀下 path('api/', include(router.urls)), ] # 移除原来的 urlpatterns += router.urls
这样你的PostViewSet接口路径就变成了http://127.0.0.1:8000/api/posts/(注意尾斜杠,DefaultRouter默认要求)。
方式2:修改桌面端请求URL
如果不想改后端,直接把桌面端api.py里的URL改成:
url = "http://127.0.0.1:8000/posts/"
其他潜在问题提醒
- 认证与权限:
ModelViewSet默认使用IsAuthenticated权限类,桌面端请求如果没有携带用户认证信息(比如token),即使路径正确,也会返回403禁止访问。可以暂时在PostViewSet中添加权限配置允许匿名创建(仅测试用,上线要改):
from rest_framework.permissions import AllowAny class PostViewSet(viewsets.ModelViewSet): queryset = Post.objects.all() serializer_class = PostSerializer permission_classes = [AllowAny] # 添加这一行
正式环境建议使用Token认证,桌面端请求时在headers中携带Authorization: Token <你的token>。
请求尾斜杠:Django默认
APPEND_SLASH = True,如果请求URL不带尾斜杠,会自动重定向,但requests.post默认不会跟随重定向,所以确保请求URL带尾斜杠(比如/api/posts/)。数据验证:确保你发送的
thread和authorID在数据库中真实存在,否则DRF会返回400错误。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

