2011-08-22 91 views
0

時間我建立使用CherryPy的和Jinja2的For循環 '打印' 每次我打刷新

簡單的網頁的Web服務器的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 

回答

4

你的問題是

def listFiles(cdir, fileslist=[]): 

你重用在每次調用同一個列表,因爲只有當函數的定義,並不是每一個它被稱爲時間默認參數進行評估。如果發生這種行爲,請參閱"Least Astonishment" and the Mutable Default Argument進行長時間討論。

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

您的問題是在函數聲明fileslist=[]。默認值只進行一次評估,這意味着該列表是在第一次調用時創建的,但從未重建或清除。

0

它是在listFilesfileslist默認kwarg。該列表在模塊加載時創建一次,並在追加時保持累積項目。