我在 nginx 服务器上有一个由 uWSGI 进程提供服务的 Django 应用程序。此应用程序使用tastypie 进行API 管理并使用memcached 来缓存一些模板块。

我的问题是 API 请求不断返回旧结果。

我正在按日期过滤我的查询

queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today()).order_by('-featured', 'date_end')

但是每天返回的对象都是一样的。

我还在上下文中添加了 date.today 以进行调试,它会正确输出当前日期。

当我重新启动 uWSGI 进程时,QuerySet 被正确评估。

所以我从这个问题中排除了 DB 和 memcached。对我来说,似乎某种 QuerySet 缓存是由tastypie 或 uWSGI 进程完成的。

我已经阅读了 tastypie caching documentation 并尝试了 NoCache 类,但没有成功。

我也读过 Django doc about QuerySet caching 但不是每次请求后都应该扔掉 QuerySet 对象吗?

更新

我检查了响应 header 和客户端缓存在 60 秒后过期,最大时限为一小时。
HTTP/1.1 200 OK
Server: nginx/1.2.6
Date: Mon, 18 Feb 2013 10:47:03 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Last-Modified: Mon, 18 Feb 2013 10:44:56 GMT
Expires: Mon, 18 Feb 2013 10:54:56 GMT
Cache-Control: max-age=600

更新

我按照建议更改了查询
    queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today).order_by('-featured', 'date_end')

但结果还是一样。

这是一个 JSON 输出示例
{
    "date_begin": "11/17/2012",
    "date_end": "11/17/2012",
    "description": "Presentazione del libro di Daniela Giusto",
    "featured": false,
    "location": "Libreria antiquaria Romeo Prampolini",
    "resource_uri": "/api/v1/event/213/",
    "time": "18:00:00",
    "title": "Un insolito Jules Verne. Tradurre umorismo e fantasia",
    "today": "2012-11-18",
}
date_begindate_end 以不同的方式格式化以实现 javascript 兼容性。

最佳答案

您的 QuerySet 对象在 Tastypie 中不是请求范围的;它跨请求持续存在。因此,您的 date.today 仅被评估一次(即使您将 date.today 函数作为参数而不是其返回值传递),而不是像您期望的那样每个请求。从 Tastypie 文档中查看 this recipe 以获得修复。

关于Django 应用程序似乎对基于 date.today() 过滤的新请求使用旧的 QuerySet 结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13434031/

10-13 09:05