Кеширует ли Django шаблоны автоматически? - PullRequest
4 голосов
/ 16 ноября 2009

Я новичок в 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 / voice / 17/16", а href для флага должен быть "/ rate / flag / 17", но что-то идет не так, и я получаю противоречивые данные.

Есть идеи?

Ответы [ 3 ]

8 голосов
/ 16 ноября 2009

Взглянув на это в некоторых моих кодах, у меня есть это в моем шаблоне:

{{ 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 голос
/ 16 ноября 2009

Django не кэширует подобные вещи по умолчанию. Убедитесь, что ваш браузер / isp / etc. не кеширует это.

Похоже, ваш запрос к базе данных не возвращает то, что вы ожидаете. Проверьте это напрямую через отладчик или с помощью отладки оператора печати, если вам нужно.

Тем не менее, вам действительно нужно долго и усердно думать о дизайне своего приложения. Использование запроса GET для внесения изменений в ваше приложение с учетом состояния - невероятно плохая идея. Особенно то, как ты это делаешь. Вам нужно изменить эти ссылки на запросы POST в одной форме. В противном случае вы обнаружите, что случайные веб-пауки разрушают ваше приложение.

1 голос
/ 16 ноября 2009

order_by('?') означает, что список упорядочен в порядке random , поэтому {{ photos.0 }} будет отличаться при каждой загрузке страницы.

Также:

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

Похоже, это не правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...