我在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对象吗?
更新
我检查了响应标头,客户端缓存在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兼容。
答案 0 :(得分:3)
您的QuerySet对象在Tastypie中不是请求范围的;它会在请求中持续存在。因此,您的date.today仅评估一次(即使您将date.today函数作为参数而不是其返回值传递),而不是像您期望的那样按请求传递。从Tastypie文档中查看this recipe以获得修复。
答案 1 :(得分:1)
尝试将此作为您的查询集值:
queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today)