bro*_*son 5 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
Run Code Online (Sandbox Code Playgroud)
并且观点:
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
Run Code Online (Sandbox Code Playgroud)
邮递员对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
Run Code Online (Sandbox Code Playgroud)
您显然依赖于 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
Run Code Online (Sandbox Code Playgroud)
DefaultRouter
不包括 HEAD 路线。您可以将其添加到routes
,或使用显式指定它UserNameView.as_view(actions={'head': ...})