Django rest框架RetrieveAPIView不起作用:404

时间:2018-08-19 09:27:17

标签: django django-rest-framework

当我尝试使用RetrieveAPIView来查看django中的URL项时:

http://142.93.130.167:1080/api/videos/1

我得到404 not found

urls.py:

url(r'^videos/$', views.VideosList.as_view(), name="videos list"),
url(r'^videos/<int:pk>', views.VideoDetail.as_view(), name="video details"),

full source

我在哪里错了?

django 1.11

2 个答案:

答案 0 :(得分:1)

好吧,至少您混合使用了受支持的尾随/行为。您最好选择其中任何一个:是否要求结尾/(在第一个正则表达式中是必需的)(在第二个正则表达式中是必需的)。将其与您在settings中的APPEND_SLASH值进行比较。

另一件事是您的URL模式名称与DRF命名样式不匹配(请参见examples):

    DRF样式的
  • videos list将是videos-list
  • video details-> videos-detail

这应该有助于DRF在HyperlinkedSerializer中确定其URL,等等。

还有一点: 在您的网址格式中,您可以使用带有path模式支持的占位符的正则表达式网址格式(url()函数)。不要混在一起。 选择这个

url(r'^videos/(?P<pk>\d+)/$', views.VideoDetail.as_view(), name="video details"),

或这个

path('videos/<int:pk>', views.VideoDetail.as_view(), name="video details"),
由于建议不要使用path,因此推荐使用

url

所以,我的建议是:

在Django> = 2.0上

  • url()-> path
  • 删除/$
  • 重命名模式以匹配DRF命名样式

在Django <2.0上

  • 修复url()正则表达式
  • 删除/$或添加到每个模式
  • 仍然,重命名模式以匹配DRF命名样式

答案 1 :(得分:0)

主要是因为URL后没有斜杠。您能否使用以下api来查看

http://142.93.130.167:1080/api/videos/1/

如果此方法有效,则表明是由于附加斜杠问题引起的。请在django documentation

中阅读

更新:

好像您需要更新您的 urls.py

url(r'^videos/(?P<pk>[0-9]+)/', views.VideoDetail.as_view(), name="video details"),

您现在可以尝试吗?