2009-05-02 3 views
0

Kürzlich habe ich ein sehr beunruhigendes Thema entdeckt.Ist das ein Fehler mit variablem Zugriff in Google Application Engine + Django?

Ich habe die folgende Python-Code bekam:

for cat in cats: 
    cat.pages = ['apple', 'table', 'computer'] 

template_values = { 
    'cats': cats 
} 

path = os.path.join(os.path.dirname(__file__), 'templates/index.html') 
self.response.out.write(template.render(path, template_values)) 

Die index.html django Template wie folgt aussieht:

{% for cat in cats %} 
    <div>{{ forloop.counter }}</div> 
    <div>name: {{ cat.cat_name }}</div> 
    <div>pages: {{ cat.pages|length }}<br> 
{% endfor %} 

Wenn ich den Code renne über lokal mit dem GAE SDK Ich habe die folgenden Beispiel-Ergebnisse:

1. 
name: sample1 
pages: 3 

2. 
name: sample2 
pages: 3 

usw. Ich kann sogar eine geschachtelte Schleife erstellen, da ich zugreifen kann s cat.pages innerhalb der Schleife. Allerdings, wenn ich diesen Code auf der App Engine hochladen, werde ich die folgenden Ergebnisse erhalten:

1. 
name: sample1 
pages: 0 

2. 
name: sample2 
pages: 0 

Und ich kann gar nicht einmal die cat.pages Variable zugreifen. Was ist falsch an meinem Code? Oder ist das ein Fehler? Es funktioniert lokal wie erwartet, erzeugt aber dieses seltsame Ergebnis nach der Bereitstellung auf GAE-Servern. Jede Hilfe wird geschätzt.

+1

Ich empfehle dringend, eine Art von dump() -Methode oder etwas für Ihre Katze Objekte schreiben und das auf einer einzigen Instanz in einer Vorlage aufrufen. Sie haben ein Systemproblem erkannt, aber keine Maßnahmen ergriffen, um festzustellen, in welchem ​​Stadium der Fehler auftritt. –

Antwort

2

Vielleicht versuchen:

for cat in cats: 
    for item in ['apple', 'table', 'computer']: 
     cat.pages.append(item) 

Wenn cat.pages etwas flippiger in GAE wie eine instrumentierte Liste, Ihr Original-Code mit einer run-of-the-mill Python-Liste Großhandel hätte ersetzt ist.

+0

Danke für den Tipp - Aufbau und Weitergabe eines reinen Python Nested Dictionary & Liste zu Django hat gut funktioniert - anstatt zu versuchen, ein GAE dbmodel mit zusätzlichen Eigenschaften zu übergeben. –

1

Ich denke, wir brauchen mehr Kontext, um zu sehen, was das Problem hier ist. Woher kommen "Katzen" und was sind die einzelnen Katzenobjekte? Ich nehme an, dass es sich um Model-Instanzen handelt, aber anhand Ihres Beispiels ist das schwer zu sagen. Funktioniert es, wenn Sie sie durch ein Array von einfachen Object-Unterklassen ersetzen? Dies würde Ihnen zeigen, ob es etwas Spezifisches für die Klasse ist, die Sie verwenden.

Im Allgemeinen ist es jedoch eine schlechte Idee, Ihren Objekten willkürliche Eigenschaften für das Templaten zuzuteilen. Sie sollten besser ein Containerobjekt oder ein Wörterbuch erstellen.

+0

'cats' war ein db.Model - Ich habe festgestellt, dass ich es nicht an Django weitergeben kann, also habe ich es in ein verschachteltes Wörterbuch in einer Python-Liste umgewandelt, dann konnte ich es an Django weitergeben. Allerdings funktionierte es lokal mit db.Models nur deshalb, dass ich dieses Problem verwirrend fand. Danke für die Hilfe, und du hast recht, es ist eine schlechte Idee, willkürliche Eigenschaften zuzuweisen! –

+0

Sie können Model-Objekte an Django-Vorlagen übergeben - versuchen Sie einfach nicht, Eigenschaften hinzuzufügen! :) –