首页 > 解决方案 > Django 是否缓存 POST 请求(及其参数)?

问题描述

我有一个 DRF API,它实现了允许GETPOST调用的视图:

@api_view([
    'GET',
    'POST',
])
@cache_page(timeout=60 * 10)
def my_view(request):
  # do stuff

我注意到:

  1. GET请求按预期缓存。

  2. POST请求根本不会被缓存。

问题:

  1. 这是故意的还是我做错了什么?

  2. 如果这按预期工作......我怎样才能让 Django 也缓存POST请求?

标签: pythondjangohttppostcaching

解决方案


从 Django 源代码中类的文档中:

有关缓存如何工作的更多详细信息: * 仅缓存状态代码为 200 的 GET 或 HEAD 请求。链接:https ://github.com/django/django/blob/master/django/middleware/cache.py

这种限制的原因可能是因为 GET 请求被认为是幂等的,而 POST 请求不是,因此缓存 POST 请求通常没有意义。这是一个很好地解释了这个概念的问题:什么是 HTTP 方法中的幂等性?

Django 是开源的,所以你总是可以扩展缓存机制来获得这种行为,但它可能会让你的 API 用户感到困惑,因为他们希望 POST 始终是一个新请求。


推荐阅读