2016-11-09 62 views
4

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

我能够通过继承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 
+0

明确指定它请提供您的网址和您的意见的代码。你在使用视图集吗? – wim

+0

添加了有问题的代码... – brocksamson

回答

3

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

# 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 

下面是相关commitgithub issue

DefaultRouter不包括HEAD路线。您可以将其添加到routes,或使用UserNameView.as_view(actions={'head': ...})

+0

不错的发现,我已经确认,将代码添加回原位启用HEAD路线。我接受了你的回答:)。由于我们已经为其他原因分类了ListModelMixin,因此我可以简单地将头部方法添加到该子类中以解决问题。 – brocksamson

+0

但是,它不适用于django 1.6和更高版本。是故意的吗? –