Django会自动缓存模板吗?

时间:2009-11-16 19:32:46

标签: python django caching django-templates

我是Django的新手,并尝试在两个图像之间实现投票系统。但是,看起来页面正在缓存或者某些东西,因为当我刷新它时,某些值是错误的。我的设置中没有缓存设置。

以下是视图:

def rate(request, type):
    photos = Photo.objects.order_by('?')[:2]
    c = Context({"photos": photos, "type": type})
    return render_to_response("base_rate.html", c)

和模板:

{% extends "base.html" %}

{% block body %}
<div class="photo">
    <img src="{{photos.0.photo.url}}" alt="Photo" />
    <a href="/rate/vote/{{photos.0.id}}/{{photos.1.id}}" class="vote">Vote</a>
    <a href="/rate/flag/{{photos.0.id}}" class="flag">Flag</a>
</div>

<div class="photo">
    <img src="{{photos.1.photo.url}}" alt="Photo" />
    <a href="/rate/vote/{{photos.1.id}}/{{photos.0.id}}" class="vote">Vote</a>
    <a href="/rate/flag/{{photos.1.id}}" class="flag">Flag</a>
</div>
{% endblock %}

某些页面将包含对象的错误信息。这是我得到的一个示例来源:

<div class="photo">
    <img src="/img/rate/16photo1.jpg" alt="Photo" />
    <a href="/rate/vote/16/17" class="vote">Vote</a>
    <a href="/rate/flag/16" class="flag">Flag</a>
</div>
<div class="photo">
    <img src="/img/rate/17photo2.jpg" alt="Photo" />
    <a href="/rate/vote/16/16" class="vote">Vote</a>
    <a href="/rate/flag/16" class="flag">Flag</a>
</div>

第二个投票href应该是“/ rate / vote / 17/16”并且标志href应该是“/ rate / flag / 17”但是出现问题并且我得到的数据不一致。

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

在我的一些代码中看一下这个,我在我的模板中有这个:

{{ mytable.0.pk }}
{{ mytable.1.pk }}
{{ mytable.0.pk }}
{{ mytable.3.pk }}

我得到了这个输出:

91596
54774
156800
23593

奇怪,直到你认为django懒惰地执行数据库查询非常。这是我的mysql日志中显示的一页加载:

SELECT `mytable`.`id` FROM `mytable` ORDER BY RAND() LIMIT 1
SELECT `mytable`.`id` FROM `mytable` ORDER BY RAND() LIMIT 1 OFFSET 1
SELECT `mytable`.`id` FROM `mytable` ORDER BY RAND() LIMIT 1
SELECT `mytable`.`id` FROM `mytable` ORDER BY RAND() LIMIT 1 OFFSET 3

每次使用点表示法时,它都会执行一个完整的新查询。我建议修改你的代码:

def rate(request, type):
    photos = list(Photo.objects.order_by('?')[:2])
    c = Context({"photos": photos, "type": type})
    return render_to_response("base_rate.html", c)

因为list()正在强制进行评估,所以它会立即执行查询。此外,这两个项目的数据已经缓存,因此没有理由再次访问数据库。你应该好好去。

答案 1 :(得分:1)

order_by('?')表示该列表以随机顺序排序,因此每次加载页面时{{ photos.0 }}都会有所不同。

此外:

<a href="/rate/vote/{{photos.1.id}}/{{photos.0.id}}" class="vote">Vote</a>
                            ^^^             ^^^

看起来这可能不正确。

答案 2 :(得分:1)

Django默认不缓存这些类型的东西。确保您的浏览器/ isp / etc。不是缓存它。

您的数据库查询似乎没有返回您期望的内容。如果必须,请直接通过调试器或使用print语句进行检查。

那就是说,你真的需要长时间地思考你的应用程序设计。使用GET请求对您的应用进行状态更改是一个非常糟糕的主意。特别是你这样做的方式。您需要将指向POST请求的链接更改为单个表单。否则,您会发现随机网络蜘蛛会破坏您的应用程序。