我有一个Flask应用程序,它运行的python函数不能正常工作。我已经确定问题的根源是函数中的for循环,但我不明白它为什么会产生问题或者如何产生问题。
我的烧瓶应用程序启动一个网络服务器,允许用户按下按钮选择"按ID搜索"或者"按日期搜索。"然后,它会将它们指向与其搜索选择相对应的不同页面,并允许它们执行搜索,从而在新选项卡中显示包含结果的html文件。然后,搜索页面会根据按钮选择重定向回原始页面。该应用程序的代码如下:
from flask import Flask, render_template, redirect, request, url_for
from xml_identifiersearch import searchXML, printHTML
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/', methods=['POST'])
def gateway():
if request.form['submit'] == 'Identifier Search':
return redirect(url_for('identifier_home'))
else:
return redirect(url_for('date_home'))
@app.route('/id/')
def identifier_home():
return render_template('id_home.html')
@app.route('/id/', methods=['POST'])
def identifier_search():
printHTML(request.form['input'])
return redirect(url_for('index'))
@app.route('/date/')
def date_home():
return render_template('date_home.html')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000,debug=True)
问题在于" printHTML"当我不在其体内包含for循环时,此功能正常工作,但一旦我这样做,问题就开始出现了。该函数的代码如下:
from xml.dom import minidom
import glob
import os
import webbrowser
import random
def searchXML(identifier):
li = []
os.chdir('/Users/dinakarguthy/Documents/audit_sample')
for files in glob.glob("*.xml"):
with open(files) as f:
contents=f.read()
if identifier in contents:
li.append(files)
return li
def printHTML(search):
f = open("output.html", "w") #output to a single html file
print >>f, '<html><head><link rel="stylesheet" type="text/css" href="my_style.css"></head><body><table border="1">'
print >>f, random.random()*100
for fileName in searchXML(search): #search and print a row for each file
xmldoc=minidom.parse('/Users/dinakarguthy/Documents/audit_sample/' + fileName) #parse the file
commonBase=xmldoc.childNodes[1]
contextData=commonBase.childNodes[1]
contextValue = contextData.childNodes[1]
y = contextValue.childNodes[0]
print >>f, "<tr>"
print >>f, "<td rowspan = '2'>" + fileName + "</td>"
print >>f, "</tr>"
print >>f, "<tr>"
for data in xmldoc.getElementsByTagName('extendedDataElements'): #Descriptions
print >>f, "<td>"
print >>f, "</td>"
print >>f, "</tr>"
print >>f, "</table></body></html>"
f.close()
"""open html page that was created on webbrowser"""
new=2
url="file:///Users/dinakarguthy/Documents/main3/output.html"
webbrowser.open(url,new=new)
问题在于:当我包含以
开头的for循环时for filenames in searchXML(search):
整个功能仅在我第一次调用它时起作用。之后,当我调用该函数时,它仍然运行,我的烧瓶应用程序工作正常,但所有函数调用之间包括行
f = open('output.html', 'w')
f.close()
不要跑。行下面的函数部分
f.close()
仍在运行。因此,仍然会打开一个显示文件output.html的新选项卡,但该文件尚未被该函数的其余部分覆盖甚至截断。这可以通过每次运行函数时生成并显示在文件顶部的随机数来证明,但此随机数不再更改。
然而,如果没有for循环,该函数可以正常工作,并且每次都会向文件写入一个新的随机数。使用for循环,它只在第一次工作,之后每次都无法运行行
f = open('output.html', 'w')
以及其下的所有相关内容。更令人好奇的是,如果我添加其他类似功能的功能,我甚至无法输出或写入 OTHER 文件。如果我在没有for循环的情况下运行其他函数,一切都正常运行,直到我用for循环运行这个函数,然后就不再输出任何东西了。
我知道这是一个很长的问题,但我真的很感激一些帮助,因为没有任何事情是有道理的。
答案 0 :(得分:0)
我自己解决了这个问题。问题在于函数“searchXML”,它在for循环中调用。该功能使用线
os.chdir('/Users/dinakarguthy/Documents/audit_sample')
但打开文件的行只是
f = open('output.html', 'w')
我用相对路径名打开文件,而不是绝对,这就是问题所在。运行for循环后,我的目录将更改为另一个目录,因此在该otehr目录中创建/编辑了不同的output.html文件。但是,我的函数仍会打开一个带有'output.html'的选项卡,该选项卡仍在原始目录中。