在 Django REST 框架中报告 405 详细视图之前检查有效 url

Check valid url before reporting 405 for detail view in Django REST framework

我有一个如下所示的 ViewSet:

class BoardViewSet(viewsets.GenericViewSet, ...):
    @detail_route(methods=["post"])
    def register(self, request, pk):
        board = self.get_object()
        ...

当我发出这些请求时,我得到了以下结果:

POST /board/1234/register -> 200
POST /board/BEEF/register -> 404 NOT FOUND
GET  /board/1234/register -> 405 NOT ALLOWED
GET  /board/BEEF/register -> 405 NOT ALLOWED

这是列表中与我有关的最后一项。对无效的 URL returns NOT ALLOWED 响应执行 GET 请求,而不是 NOT FOUND 响应,即使那是无效的 URL。我理解为什么会发生这种情况,就 Django 和 DRF 的路由的工作方式而言。我的问题是双重的:

  1. 就 HTTP 响应代码语义而言,这是适当的行为吗?
  2. 如果没有,是否有解决此问题的(好)方法?

Is this the appropriate behavior, in terms of HTTP response code semantics?

嗯,你只接受“/board/([^/.]+)/register”上的 POST 方法 url 所以 return 405 似乎是合法的状态码。

If not, is there a (good) way to fix this?

您应该将视图 lookup_value_regex 设置得更具体,以便它只匹配您期望的 ID。这样,如果 url 正则表达式不匹配,它将跳过该视图并继续前进,最终以 404.

结束