对于每次点击刷新时“打印”的循环

时间:2011-08-22 21:15:45

标签: python cherrypy jinja2

我使用CherryPy和Jinja2构建简单的网页

webserver python文件:

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>

好的,然后我运行webserver,我转到127.0.0.1:8080并查看预期的结果:

  

Hello Pawel!

     
      
  • 模板\ index.html的
  •   
  • 模板\ list.html
  •   

然后我在浏览器中点击刷新,这是一个结果:

  

Hello Pawel!

     
      
  • 模板\ index.html的
  •   
  • 模板\ list.html
  •   
  • 模板\ index.html的
  •   
  • 模板\ list.html
  •   

为什么呢? for循环再次评估?如何防止这样做?

如果有人想知道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 个答案:

答案 0 :(得分:4)

你的问题是

 def listFiles(cdir, fileslist=[]):

您在每次调用时都重复使用相同的列表,因为默认参数仅在定义函数时计算,而不是每次调用时都计算。如果出现这种情况,请参阅"Least Astonishment" and the Mutable Default Argument进行长时间的讨论。

待办事项

 def listFiles(cdir, fileslist=None):
     if fileslist is None:
         fileslist = []

答案 1 :(得分:0)

您的问题在函数声明中的fileslist=[]中。默认值只会被评估一次,这意味着列表是在第一次调用时创建的,但从不重建或清除。

答案 2 :(得分:0)

这是fileslistlistFiles的默认kwarg。该列表在模块加载时创建一次,并在您追加时保留累积项目。