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

标签 python django rest django-rest-framework

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

我可以通过子类化 DefaultRouter 并更改路由默认值来解决此问题,但我认为这不是最佳或正确的解决方案。通过阅读 django-rest-framework 问题和文档,django-rest-framework 似乎应该自动处理 HEAD 和 OPTIONS 方法。

@detail_route、@list_route 和派生自允许 GET 方法的 ApiView 的 View 将自动获得 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

和 View :

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

postman 对 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

最佳答案

您显然依赖于 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': ...})

明确指定它

关于python - 升级到 django-rest-framework 3.5.3 后不允许使用 HEAD 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40515609/

相关文章:

c# - 使用 Xamarin.forms 使用 RESTful API

python - 为什么相同的 SQLite 查询在只获取两倍的结果时会慢 30 倍?

django - 断言错误 : database connection isn't set to UTC

java - MVC REST API 中使用 Jackson 的动态 JSON 类型

django - 如何使用 django Rest 框架和自定义用户模型创建新用户

python - order.by ('?' ) .first() 在 Django 中获取随机内容时出现问题

java - Spring Properties 文件不 Autowiring ,@Value 值始终为 NULL

python - Python 中的属性解析如何工作?

python - 如何在 pyodbc 中自动调用 fetchall() 而不进行异常处理?

python - 如何加载 tensorflow 模型并继续训练