升级到django-rest-framework 3.5.3后不允许使用HEAD方法

时间:2016-11-09 20:37:50

标签: python django rest django-rest-framework

我们正在将django-rest-framework从3.1.3升级到3.5.3。在升级之后,利用DefaultRouter生成URL的所有ModelViewSet和viewsets.GenericViewSet视图都不再允许HEAD方法调用。我搜索了发行说明和文档,但未能找到导致HEAD被禁止的任何设置或更改。

我能够通过继承DefaultRouter并改变路由默认值来解决这个问题,但我认为这不是最佳或正确的解决方案。从django-rest-framework问题和文档中读取,似乎django-rest-framework应该自动处理HEAD和OPTIONS方法。

@detail_route,@ list_route和从ApiView派生的视图允许GET方法自动获得HEAD和OPTION方法。

为什么升级后HEAD方法会消失?在路线上允许使用HEAD方法的正确方法是什么?

我们的路线和ModelViewSet定义非常标准,这是一条非工作路线:

from rest_framework.routers import DefaultRouter
from user_profile import views

router = DefaultRouter(trailing_slash=False)
router.register(r'user_names', views.UserNameView)

urlpatterns = router.urls

观点:

class UserNameView(mixins.ListModelMixin,
        mixins.RetrieveModelMixin,
        viewsets.GenericViewSet):
    queryset = User.objects.only(
        "id", "first_name", "last_name", "email",
        "mobile_phone", "photo", "is_active", "date_joined"
    ).select_related("photo").all()
    serializer_class = serializers.UserNameSerializer

邮递员对HEAD电话的回应:

Status: 405 Method Not Allowed
Allow →GET, OPTIONS
Content-Type →application/json
Date →Wed, 09 Nov 2016 20:50:41 GMT
Server →WSGIServer/0.1 Python/2.7.12
Vary →Cookie
X-Frame-Options →SAMEORIGIN
x-xss-protection →1; mode=block

1 个答案:

答案 0 :(得分:4)

您显然依赖于在3.5.0版中删除的旧行为。

<input id="submit" name="submit" type="submit" value="Submit">

以下是相关的commitgithub issue

# Patch this in as it's otherwise only present from 1.5 onwards if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get 不包含HEAD路线。您可以将其添加到DefaultRouter,或使用routes

明确指定