我在 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_begin
和 date_end
以不同的方式格式化以实现 javascript 兼容性。 最佳答案
您的 QuerySet 对象在 Tastypie 中不是请求范围的;它跨请求持续存在。因此,您的 date.today 仅被评估一次(即使您将 date.today 函数作为参数而不是其返回值传递),而不是像您期望的那样每个请求。从 Tastypie 文档中查看 this recipe 以获得修复。
关于Django 应用程序似乎对基于 date.today() 过滤的新请求使用旧的 QuerySet 结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13434031/