我使用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
答案 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)
这是fileslist
中listFiles
的默认kwarg。该列表在模块加载时创建一次,并在您追加时保留累积项目。