【问题标题】:For loop is 'printed' every time I hit refresh每次我点击刷新时都会“打印”for循环
【发布时间】:2011-08-22 21:15:45
【问题描述】:

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

网络服务器 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 并看到预期的结果:

你好帕维尔!

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

然后我在浏览器中点击刷新,结果如下:

你好帕维尔!

  • 模板\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

【问题讨论】:

    标签: python cherrypy jinja2


    【解决方案1】:

    你的问题是

     def listFiles(cdir, fileslist=[]):
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-03
          • 2019-01-28
          • 2011-08-16
          • 2014-01-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多