Цикл For печатается каждый раз, когда я нажимаю кнопку Обновить - PullRequest
0 голосов
/ 23 августа 2011

Я создаю простую веб-страницу, используя CherryPy и Jinja2

Файл питона веб-сервера:

import cherrypy
from jinja2 import Environment, FileSystemLoader
from soltyslib import listFiles
env = Environment(loader=FileSystemLoader('templates'))
class HelloWorld(object):   
    @cherrypy.expose        
    def index(self):        
        template = env.get_template('index.html')
        result = template.render(name='Pawel',files=listFiles('templates'))
        return result    

cherrypy.quickstart(HelloWorld())

Файл шаблона:

Hello {{name}}!
<ul>
{% for file in files %}
    <li>{{file}}</li>
{% endfor %}
</ul>

Хорошо, и затем я запускаю веб-сервер, Я перехожу к 127.0.0.1:8080 и вижу ожидаемый результат:

Hello Pawel!

  • templates \ index.html
  • templates \list.html

Но затем я нажимаю кнопку обновления в браузере, и вот результат:

Hello Pawel!

  • templates\ index.html
  • templates \ list.html
  • templates \ index.html
  • templates \ list.html

Почему?цикл снова оценивается?Как предотвратить это?

А если кому-то интересно, как выглядит функция listFiles:

import os,sys
from collections import deque
def listFiles(cdir, fileslist=[]):
    basedir = cdir
    queuedir = deque()
    queuedir.append(basedir)
    while len(queuedir) > 0:
        currentbase = queuedir.popleft()
        for f in os.listdir(currentbase):
            f = os.path.join(currentbase,f)
            if os.path.isdir(f):           
                queuedir.append(f)
            else:
                fileslist.append(f)

    return fileslist

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

Ваша проблема

 def listFiles(cdir, fileslist=[]):

Вы используете один и тот же список при каждом вызове, потому что аргументы по умолчанию оцениваются только тогда, когда функция определена, а не каждый раз, когда она вызывается.См. «Наименьшее изумление» и изменяемый аргумент по умолчанию для подробного обсуждения этого поведения.

Do

 def listFiles(cdir, fileslist=None):
     if fileslist is None:
         fileslist = []
0 голосов
/ 23 августа 2011

Это kwarg по умолчанию для fileslist в listFiles.Этот список создается один раз во время загрузки модуля и продолжает накапливать элементы по мере добавления.

0 голосов
/ 23 августа 2011

Ваша проблема в fileslist=[] в объявлении функции. Значения по умолчанию оцениваются только один раз, что означает, что список создается при первом вызове, но никогда не перестраивается и не очищается.

...