使用Python Flask读取字符串变量并上载.txt文件?
我正在尝试使用Python和Flask构建一个web应用程序,以将.JSON转换为.CSV格式 下面是它应该如何工作。 应用程序以编程方式从API下载JSON文件,我需要将其转换为.CSV格式,当用户访问链接时,它应该将JSON转换为.CSV,并且应该自动下载并将其保存在用户的本地磁盘中 最初,我的方法是在服务器本地磁盘中下载JSON文件,并通过创建新文件将其转换为CSV文件,通过使用send_file,用户可以下载CSV文件 但是,由于我部署到Heroku中,并且我意识到Heroku文件系统是临时的,我不能存储任何文件。我必须改变文件的概念,并将其转换为字符串变量 这就是我的代码在部署到heroku之后的样子使用Python Flask读取字符串变量并上载.txt文件?,python,csv,heroku,flask,Python,Csv,Heroku,Flask,我正在尝试使用Python和Flask构建一个web应用程序,以将.JSON转换为.CSV格式 下面是它应该如何工作。 应用程序以编程方式从API下载JSON文件,我需要将其转换为.CSV格式,当用户访问链接时,它应该将JSON转换为.CSV,并且应该自动下载并将其保存在用户的本地磁盘中 最初,我的方法是在服务器本地磁盘中下载JSON文件,并通过创建新文件将其转换为CSV文件,通过使用send_file,用户可以下载CSV文件 但是,由于我部署到Heroku中,并且我意识到Heroku文件系统是
from flask import Flask,render_template,send_file
import requests
import os
import csv
import json
#import urllib.request
app = Flask(__name__,template_folder='templates')
@app.route('/')
def index():
return render_template('index.html')
@app.route('/jsonParser')
def jsonParser():
download_url = "https://www....." #link to .JSON file.
r = requests.get(download_url)
x = json.loads(r.content)
outputArray = ["id", "phones", "email", "firstname", "lastname","role","username","isActive","_created_at","_updated_at"]
output = ','.join(outputArray)
try:
idValue = x["id"] or x["_id"]
idValue = str(idValue)
except:
idValue = x["_id"] or "nil"
output2 = ",".join([ idValue ,
x["phones"] or "nil",
x["email"] or "nil",
x["firstname"] or "nil",
x["lastname"] or "nil",
str(x["role"]) or "nil",
x["username"] or "nil",
str(x["isActive"]) or "nil" ,
str(x["_created_at"]) or "",
str(x["_updated_at"]) or ""])
output = output + "<br>" + output2 #'\n'.join([output, output2])
return output
if __name__ == "__main__":
app.run(debug=True,threaded=True)
从flask导入flask,呈现\u模板,发送\u文件
导入请求
导入操作系统
导入csv
导入json
#导入urllib.request
app=Flask(\uuuuu name\uuuuuuuuu,template\u folder='templates'))
@应用程序路径(“/”)
def index():
返回渲染模板('index.html')
@app.route(“/jsonParser”)
def jsonParser():
下载_url=”https://www.....“#链接到.JSON文件。
r=requests.get(下载url)
x=json.loads(r.content)
outputArray=[“id”、“电话”、“电子邮件”、“名字”、“姓氏”、“角色”、“用户名”、“isActive”、“\u创建位置”、“\u更新位置”]
输出=','。连接(输出阵列)
尝试:
idValue=x[“id”]或x[“\u id”]
idValue=str(idValue)
除:
idValue=x[“\u id”]或“nil”
output2=“,”.join([idValue,
x[“电话”]或“无”,
x[“电子邮件”]或“无”,
x[“firstname”]或“nil”,
x[“lastname”]或“nil”,
str(x[“角色”])或“无”,
x[“用户名”]或“无”,
str(x[“isActive”])或“nil”,
str(x[“\u在”]处创建)或“,
str(x[“\u更新位置”])或“])
output=output+“
”+output2#'\n.连接([output,output2])
返回输出
如果名称=“\uuuuu main\uuuuuuuu”:
运行(debug=True,threaded=True)
现在,
输出
变量由转换后的.CSV组成。我想知道是否有任何方法可以将其转换为.txt文件,以便用户可以通过访问/jsonParser下载它,而无需将.txt文件存储在服务器端 这就是你想做的吗?
你能试一下吗
from io import StringIO
from flask import Response
@app.route('/jsonParser')
def jsonParser():
...
output = output + "<br>" + output2 # '\n'.join([output, output2])
string_out = StringIO()
string_out.write(output)
returnfile = string_out.getvalue()
return Response(returnfile, mimetype="text/plain", headers={"Content-disposition": "attachment; filename=output.txt"})
从io导入StringIO
从烧瓶导入响应
@app.route(“/jsonParser”)
def jsonParser():
...
output=output+“
”+output2#'\n.连接([output,output2])
string_out=StringIO()
字符串输出。写入(输出)
returnfile=string\u out.getvalue()
返回响应(returnfile,mimetype=“text/plain”,标题={“内容处置”:“附件;文件名=output.txt”})
这里似乎有多个问题,你能缩小范围吗.csv
只是一个文件扩展名,您当然可以将其更改为.txt
。就这些吗?输出变量仍然是字符串,而不是.CSV格式。只是输出变量包含.CSV文件的内容,但为字符串格式。我想从后端上传字符串,这样用户就可以下载它。这有意义吗?