2016-11-09 65 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和更高版本。是故意的嗎? –