3

我有一个 Django 应用程序,由 nginx 服务器上的 uWSGI 进程提供服务。这个应用程序使用tastepie 进行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 缓存似乎是由美味派或 uWSGI 进程完成的。

我已经阅读了美味的缓存文档并尝试了 NoCache 类但没有成功。

我还阅读了有关 QuerySet 缓存的 Django 文档,但 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_begindate_end以不同的方式格式化以实现 javascript 兼容性。

4

2 回答 2

3

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

于 2013-02-21T16:09:06.620 回答
1

试试这个作为你的查询集值:

queryset = Event.objects.filter(status='P').exclude(date_end__lt=date.today)
于 2012-11-17T20:28:44.827 回答