É este um bug com acesso variável no Application Engine Google + Django?
-
03-07-2019 - |
Pergunta
Recentemente eu visto uma questão muito preocupante.
Eu tenho o seguinte código 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))
Os index.html modelo de Django esta aparência:
{% for cat in cats %}
<div>{{ forloop.counter }}</div>
<div>name: {{ cat.cat_name }}</div>
<div>pages: {{ cat.pages|length }}<br>
{% endfor %}
Quando eu estou correndo o código acima localmente com o GAE SDK, eu tenho os resultados seguinte exemplo:
1.
name: sample1
pages: 3
2.
name: sample2
pages: 3
etc. Eu posso até mesmo construir um loop aninhado desde que eu posso acessar cat.pages dentro do loop. No entanto, quando eu carregar este código para o AppEngine, eu vou pegar os seguintes resultados:
1.
name: sample1
pages: 0
2.
name: sample2
pages: 0
E eu posso nem mesmo acessar a variável cat.pages em tudo. O que há de errado com o meu código? Ou isso é um bug? Ele funciona localmente, como é esperado, mas produz este resultado estranho após a implantação de servidores do GAE. Qualquer ajuda é apreciada.
Solução
Talvez tente:
for cat in cats:
for item in ['apple', 'table', 'computer']:
cat.pages.append(item)
Se cat.pages é algo desagradável em GAE como uma lista instrumentada, seu código original teria substituí-lo atacado com uma lista python run-of-the-mill.
Outras dicas
Eu acho que nós vamos precisar de mais contexto para ver qual é o problema aqui. Onde é que 'gatos' vem, e quais são os objetos gato individuais? Eu estou supondo que eles são instâncias de modelo, mas é difícil dizer com base no seu exemplo. Será que funciona se você substituí-los com uma variedade de subclasses objeto simples? Isso iria mostrar-lhe se é algo específico para a classe que você está usando.
Em geral, porém, é uma má idéia para atribuir propriedades arbitrárias de seus objetos para templates conveniência. Você seria melhor criar um objeto de recipiente, ou dicionário.