Это ошибка с переменным доступом в Google Application Engine + Django? - PullRequest
0 голосов
/ 02 мая 2009

Недавно я заметил очень тревожную проблему.

У меня есть следующий код Python:

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

Шаблон index.html django выглядит следующим образом:

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

Когда я запускаю приведенный выше код локально с GAE SDK, я получаю следующий пример:

1.
name: sample1
pages: 3

2.
name: sample2
pages: 3

и т.д.. Я даже могу создать вложенный цикл, так как я могу получить доступ к cat.pages внутри цикла. Однако, когда я загружу этот код в AppEngine, я получу следующие результаты:

1.
name: sample1
pages: 0

2.
name: sample2
pages: 0

И я вообще не могу получить доступ к переменной cat.pages. Что не так с моим кодом? Или это ошибка? Он работает локально, как и ожидалось, но выдает этот странный результат после развертывания на серверах GAE. Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 02 мая 2009

Может быть попробовать:

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

Если cat.pages что-то напуганное в GAE, как инструментированный список, ваш оригинальный код заменит его оптом на заурядный список питонов.

1 голос
/ 02 мая 2009

Я думаю, нам понадобится больше контекста, чтобы понять, в чем здесь проблема. Откуда происходят «кошки» и каковы отдельные объекты кошек? Я предполагаю, что это экземпляры Model, но на основании вашего примера это сложно сказать. Работает ли это, если вы замените их массивом простых подклассов Object? Это покажет вам, если это что-то конкретное для класса, который вы используете.

В общем, плохая идея назначать произвольные свойства вашим объектам для удобства шаблонов. Вам лучше создать объект-контейнер или словарь.

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