在 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 的路由的工作方式而言。我的问题是双重的:
- 就 HTTP 响应代码语义而言,这是适当的行为吗?
- 如果没有,是否有解决此问题的(好)方法?
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.
结束
我有一个如下所示的 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 的路由的工作方式而言。我的问题是双重的:
- 就 HTTP 响应代码语义而言,这是适当的行为吗?
- 如果没有,是否有解决此问题的(好)方法?
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.