Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Flask上载和下载文件_Python_Python 2.7_File Upload_Flask_Pythonanywhere - Fatal编程技术网

Python 使用Flask上载和下载文件

Python 使用Flask上载和下载文件,python,python-2.7,file-upload,flask,pythonanywhere,Python,Python 2.7,File Upload,Flask,Pythonanywhere,我试图用pythonywhere和Flask编写一个简单的webapp,它允许用户上传一个文本文件,生成一个csv文件,然后让用户下载csv文件。它不需要花哨,只需要工作就行了。我已经编写了从驱动器上的txt文件生成csv的程序 现在,my function使用以下命令打开驱动器上的文件: with open(INPUTFILE, "r") as fname: 并使用以下内容写入csv: with open(OUTPUTFILE, 'w') as fname: INPUTFILE和OUTPU

我试图用pythonywhere和Flask编写一个简单的webapp,它允许用户上传一个文本文件,生成一个csv文件,然后让用户下载csv文件。它不需要花哨,只需要工作就行了。我已经编写了从驱动器上的txt文件生成csv的程序

现在,my function使用以下命令打开驱动器上的文件:

with open(INPUTFILE, "r") as fname:
并使用以下内容写入csv:

with open(OUTPUTFILE, 'w') as fname:
INPUTFILE和OUTPUTFILE为文件名字符串

对我来说,将文件作为对象处理会更好吗,以某种方式由flask/html返回


我不知道怎么做。我应该如何组织这个程序?我需要多少HTML模板?我更愿意在不将文件保存到任何地方的情况下处理这些文件,但是如果我必须将它们保存到PythonAnywhere目录,我可以。我该怎么做

pythonany,这里是dev。这是一个关于Flask和web开发的一般性问题,而不是针对我们的系统,因此我将尝试给出一个一般性的答案,而不针对我们:-)

有几件事我需要知道才能给你的问题一个明确的答案,所以我将从列出我正在做的假设开始——如果我对其中任何一个有错误,请给我留下评论,我会适当地更新答案

  • 我假设你上传的文件不是很大,可以放入一个合理的内存量——比方说,小于1兆字节
  • 我假设您为从文本文件生成CSV而编写的程序是Python,并且它有一个函数(或者可能更容易更改为有),该函数接受包含文本文件内容的字符串,并返回需要写入CSV的内容
如果这两种情况都是如此,那么构建Flask应用程序的最佳方法就是处理Flask中的所有内容。一个代码示例相当于一千个单词,因此我制作了一个简单的示例,它允许用户上传一个文本文件,并通过一个名为
transform
的函数运行它(这就是转换程序中的函数的位置——我的示例只是将
=
替换为
整个文件),并将结果发送回浏览器

从烧瓶导入烧瓶,做出响应,请求
app=烧瓶(名称)
def转换(文本文件内容):
返回文本文件内容。替换(“=”,“,”)
@应用程序路径(“/”)
def form():
返回“”
转换文件演示
"""
@app.route('/transform',methods=[“POST”])
def transform_view():
request\u file=request.files['data\u file']
如果没有请求\u文件:
返回“无文件”
file\u contents=request\u file.stream.read().decode(“utf-8”)
结果=转换(文件内容)
响应=作出响应(结果)
response.headers[“内容处置”]=“附件;文件名=结果.csv”
返回响应
关于你的其他问题:

  • 模板:我没有在这个示例中使用模板,因为我希望所有的模板都适合一段代码。如果我做得好,那么我会将
    表单
    视图生成的内容放入模板中,但仅此而已
  • 您可以通过写入文件来完成吗?是的,您可以,并且可以通过使用的
    属性的
    文件
    对象上的
    保存(
    filename
    方法来保存上载的文件。但是如果您的文件非常小(根据我上面的假设),那么像上面的代码那样在内存中处理它们可能更有意义
我希望这一切都能有所帮助,如果您有任何问题,请留下评论。

最好补充一下

response.headers["Cache-Control"] = "must-revalidate"
response.headers["Pragma"] = "must-revalidate"
response.headers["Content-type"] = "application/csv"

如果不添加内容类型,FF 48.0会将其报告为html,并打开一次html保存对话框,然后再打开CSV保存对话框。如果您不添加缓存控制,您的结果可能会被缓存,如果您提供活动内容,这不是您想要的。如果您使用“必须重新验证且不过期”,它将有效地充当无缓存-请参阅和以获取解释。

回答得很好。尝试在这里应用它的元素:我尝试了python anywhere演示,它不工作,我得到:内部服务器错误服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序出错。我不会用file变量为文件类型别名。
response.headers["Cache-Control"] = "must-revalidate"
response.headers["Pragma"] = "must-revalidate"
response.headers["Content-type"] = "application/csv"