我试图用PythonAnywhere和Flask编写一个非常简单的webapp,它允许用户上传文本文件,生成csv文件,然后让用户下载csv文件。它不一定要花哨,它只需要工作。我已经编写了从驱动器上的txt文件生成csv的程序。
现在,我的函数打开驱动器上的文件:
with open(INPUTFILE, "r") as fname:
并将csv写为:
with open(OUTPUTFILE, 'w') as fname:
INPUTFILE和OUTPUTFILE是文件名字符串。
对于我来说,将文件作为对象处理会更好吗,不知道怎么回事烧瓶/ html?
我不知道该怎么做。我该如何构建这个程序?我需要多少个HTML模板?我宁愿在没有将它们保存到任何地方的情况下处理文件,但如果我必须将它们保存到PythonAnywhere目录,我可以。我怎样才能做到这一点?
答案 0 :(得分:27)
PythonAnywhere dev在这里。这是关于Flask和web开发的一个很好的问题,而不是我们系统的具体问题,所以我会尝试给出一个没有任何特定的通用答案: - )
我需要知道一些事情,以便对你的问题给出明确的答案,所以我首先列出我正在做的假设 - 如果我错了任何一个,请留言他们,我会适当地更新答案。
如果两者都是这种情况,那么构建Flask应用程序的最佳方法是处理Flask中的所有内容。一个代码示例胜过千言万语,所以这里是一个简单的代码,我将它放在一起,允许用户上传一个文本文件,通过一个名为transform
的函数运行它(这是转换程序中的函数将插入的位置) in - mine只是在整个文件中用=
替换,
,然后将结果发送回浏览器。 There's a live version of this app on PythonAnywhere here
from flask import Flask, make_response, request
app = Flask(__name__)
def transform(text_file_contents):
return text_file_contents.replace("=", ",")
@app.route('/')
def form():
return """
<html>
<body>
<h1>Transform a file demo</h1>
<form action="/transform" method="post" enctype="multipart/form-data">
<input type="file" name="data_file" />
<input type="submit" />
</form>
</body>
</html>
"""
@app.route('/transform', methods=["POST"])
def transform_view():
request_file = request.files['data_file']
if not request_file:
return "No file"
file_contents = request_file.stream.read().decode("utf-8")
result = transform(file_contents)
response = make_response(result)
response.headers["Content-Disposition"] = "attachment; filename=result.csv"
return response
关于您的其他问题:
form
视图生成的内容放入模板中,但这就是全部。save(
文件名 )
方法保存上传的文件1}}我正在使用file
属性的对象。但是如果你的文件非常小(根据我上面的假设)那么在内存中处理它们可能比上面的代码更有意义。我希望一切都有所帮助,如果您有任何疑问,请发表评论。
答案 1 :(得分:6)
最好添加
response.headers["Cache-Control"] = "must-revalidate"
response.headers["Pragma"] = "must-revalidate"
response.headers["Content-type"] = "application/csv"
如果您没有添加内容类型,则FF 48.0将其报告为html,并为HTML打开一次“保存”对话框,然后为CSV打开。如果您不添加缓存控制,您的结果可能会被缓存,如果您提供的是活动内容,则这不是您想要的。如果您使用must-revalidate且没有年龄,它将有效地用作无缓存 - 请参阅here和here以获取解释。