4 Stimmen

Legt Django Templates automatisch im Cache ab?

Ich bin neu in Django und versuche, ein Abstimmungssystem zwischen zwei Bildern zu implementieren. Es sieht jedoch so aus, als ob die Seite gecached wird oder so, denn wenn ich sie aktualisiere, sind einige Werte falsch. Ich habe keine Cache-Einstellung in meinen Einstellungen.

Hier ist die Ansicht:

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

und die Vorlage:

{% extends "base.html" %}

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

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

Einige Seiten enthalten falsche Informationen zu den Objekten. Hier ist eine Beispielquelle, die ich erhalte:

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

Die zweite Vote href sollte "/rate/vote/17/16" sein und die Flag href sollte "/rate/flag/17" sein, aber irgendetwas läuft schief und ich bekomme inkonsistente Daten.

Irgendwelche Ideen?

8voto

Jack M. Punkte 27217

Ein Blick auf diese in einigen meiner Code, ich habe diese in meiner Vorlage:

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

Und ich erhalte diese Ausgabe:

91596
54774
156800
23593

Seltsam, bis man bedenkt, dass django Datenbankabfragen ausführt sehr faul. Dies ist, was zeigt sich in meinem mysql log für eine Seite laden:

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

Jedes Mal, wenn Sie die Punktschreibweise verwenden, wird eine völlig neue Abfrage ausgeführt. Ich würde vorschlagen, Ihren Code wie folgt zu ändern:

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)

Weil die list() eine Auswertung erzwingt, wird die Abfrage sofort ausgeführt. Außerdem sind die Daten für diese beiden Elemente bereits zwischengespeichert, so dass es keinen Grund gibt, die Datenbank erneut aufzurufen. Sie sollten bereit sein.

1voto

jacobian Punkte 4558

order_by('?') bedeutet, dass die Liste geordnet ist in zufällig Ordnung, also {{ photos.0 }} ist jedes Mal anders, wenn Sie die Seite laden.

También:

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

Das ist wahrscheinlich nicht korrekt.

1voto

Paul McMillan Punkte 19166

Django zwischenspeichert diese Art von Dingen nicht standardmäßig. Stellen Sie sicher, dass Ihr Browser/isp/etc. es nicht zwischenspeichert.

Es sieht so aus, als ob Ihre Datenbankabfrage nicht das zurückgibt, was Sie erwarten. Überprüfen Sie das direkt über Ihren Debugger oder mit der Druckanweisungsprüfung, wenn Sie müssen.

Das heißt, Sie müssen wirklich lange und gründlich über Ihr App-Design nachdenken. Eine GET-Anfrage zu verwenden, um Zustandsänderungen an Ihrer Anwendung vorzunehmen, ist eine denkbar schlechte Idee. Vor allem so, wie Sie es tun. Sie müssen diese Links in POST-Anfragen an ein einzelnes Formular ändern. Andernfalls werden Sie feststellen, dass zufällige Webspider Ihre Anwendung zerstören.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X