Django会自动缓存模板吗?

2024-05-11 10:13:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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)

以及模板:

^{pr2}$

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

<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”,但是出现了问题,我得到的数据不一致。在

有什么想法吗?在


Tags: divsrcimgratetype页面classflag
3条回答

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

同时:

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

看来这可能不对。在

在我的一些代码中可以看到,我的模板中有:

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

我得到这个输出:

^{pr2}$

奇怪的是,除非您认为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()正在强制求值,它将立即执行查询。此外,这两个项目的数据都已经缓存,因此没有理由再次访问数据库。你该走了。在

Django默认情况下不会缓存这些类型的内容。确保您的浏览器/isp/等没有缓存它。在

数据库查询似乎没有返回预期的结果。直接通过调试器或打印语句调试(如果需要的话)进行检查。在

也就是说,你真的需要花很长时间认真考虑你的应用程序设计。使用GET请求对应用程序进行有状态的更改是一个非常糟糕的主意。尤其是你这样做的方式。您需要更改这些链接以将请求发送到单个表单。否则,您会发现随机的网络蜘蛛会破坏您的应用程序。在

相关问题 更多 >