我有Flask应用程序,并且在该应用程序中,我有一个视图,该视图用于使用 xlsxwriter 编写和保存 Excel 文件。当我在本地运行该应用程序时,它可以完美运行。当我部署它时,除我在其中写入Excel文件的视图外,所有视图均有效,它给了我错误500。。在日志中,我的错误是我试图使用仅适用于Windows的功能,有人可以告诉我如何启动文件或下载文件吗?我不需要将其存储在数据库或云存储中,只需立即打印或下载即可。附言:如果我在问这个问题时出错,请原谅。
@app.route("/proverka", methods=['GET', 'POST'])
def proverka():
stream = artikli.query.all()
mah_id=db.session.query(db.func.max(info.id)).first()
s=info.query.filter_by(id=mah_id[0]).first()
if request.method=='POST':
workbook = xlsxwriter.Workbook('ISPRATNICI\\{}, {}.xlsx'.format(s.id, s.ime))
brojac=9
worksheet = workbook.add_worksheet()
#NASLOV
merge_format = workbook.add_format({'align': 'center', "size": "30"})
worksheet.merge_range('A1:F1',"„Оска-Пром“ Дооел Виница" , merge_format)
#informacii za firmata
worksheet.write("B3", "ул. Страшо Пинџур бр.2")
worksheet.write("B4", "033/363-841")
worksheet.write("B5", "071-229-482")
#informacii za kupuvacot
podatoci_format = workbook.add_format({'align': 'center', "size": "13"})
worksheet.merge_range('D3:E3',s.ime, podatoci_format)
worksheet.merge_range('D4:E4',s.kontakt, podatoci_format)
worksheet.merge_range('D5:E5', s.ulica, podatoci_format)
#Ispratnica br.
ispratnica_format = workbook.add_format({'align': 'center', "size": "20"})
worksheet.merge_range('A8:F8',"Испратница бр. {}".format(s.id) , ispratnica_format)
#kategorii
meni_format = workbook.add_format({'align': 'center', "size":"14", "border":1})
vkupno=workbook.add_format({"border":1,'align': 'center', "size":"14", })
worksheet.write("A9", "р.бр.", meni_format)
worksheet.write("B9", "Назив на артикл", meni_format)
worksheet.write("C9", "Количина", meni_format)
worksheet.write("D9", "Цена", meni_format)
worksheet.write("E9", "Износ", meni_format)
worksheet.write("D39", "Вкупно", vkupno)
worksheet.set_column("A:A", 7.43)
worksheet.set_column("B:B", 32)
worksheet.set_column("C:E", 12)
worksheet.set_row(7, 38)
#tabeli granica
granica=workbook.add_format({"border":1})
#artikli
for i in stream:
worksheet.write(brojac, 0, i.id, granica)
worksheet.write(brojac, 1, i.model, granica)
worksheet.write(brojac, 2, i.kolicina, granica)
worksheet.write(brojac,3, i.cena, granica)
worksheet.write(brojac, 4, i.vkupno, granica)
brojac+=1
saldo=workbook.add_format({"align":"center", "size":"16", "border":2})
worksheet.write_formula('E39', '=SUM(E9:E38)', saldo)
workbook.close()
for i in stream:
kolicini_za_menjanje=magacin.query.filter_by(model=i.model).first()
print(kolicini_za_menjanje.kolicina)
nova_kol=kolicini_za_menjanje.kolicina-i.kolicina
print(nova_kol)
kolicini_za_menjanje.kolicina = nova_kol
db.session.commit()
#IZBRISI ARTIKLI
brisi=artikli.query.all()
for i in brisi:
artikli.query.filter_by(id=i.id).delete()
db.session.commit()
os.startfile("C:\\Users\\Nenad\\Desktop\\magacin vs\\ISPRATNICI\\{}, {}.xlsx".format(s.id, s.ime))
return redirect(url_for("home"))
return render_template("proverka.html", stream=stream, s=s)
日志:
2020-02-22T16:10:18.789403+00:00 app[web.1]: [2020-02-22 16:10:18,787] ERROR in app: Exception on /proverka [POST]
2020-02-22T16:10:18.789405+00:00 app[web.1]: Traceback (most recent call last):
2020-02-22T16:10:18.789406+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
2020-02-22T16:10:18.789407+00:00 app[web.1]: response = self.full_dispatch_request()
2020-02-22T16:10:18.789408+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
2020-02-22T16:10:18.789408+00:00 app[web.1]: rv = self.handle_user_exception(e)
2020-02-22T16:10:18.789408+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
2020-02-22T16:10:18.789409+00:00 app[web.1]: reraise(exc_type, exc_value, tb)
2020-02-22T16:10:18.789409+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
2020-02-22T16:10:18.789410+00:00 app[web.1]: raise value
2020-02-22T16:10:18.789410+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
2020-02-22T16:10:18.789411+00:00 app[web.1]: rv = self.dispatch_request()
2020-02-22T16:10:18.789411+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
2020-02-22T16:10:18.789412+00:00 app[web.1]: return self.view_functions[rule.endpoint](**req.view_args)
2020-02-22T16:10:18.789413+00:00 app[web.1]: File "/app/app.py", line 206, in proverka
2020-02-22T16:10:18.789413+00:00 app[web.1]: os.startfile("C:\\Users\\Nenad\\Desktop\\magacin vs\\ISPRATNICI\\{}, {}.xlsx".format(s.id, s.ime))
2020-02-22T16:10:18.789414+00:00 app[web.1]: AttributeError: module 'os' has no attribute 'startfile'
2020-02-22T16:10:18.790447+00:00 app[web.1]: 10.102.224.122 - - [22/Feb/2020:16:10:18 +0000] "POST /proverka HTTP/1.1" 500 290 "https://oska-prom.herokuapp.com/proverka" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
2020-02-22T16:10:18.790269+00:00 heroku[router]: at=info method=POST path="/proverka" host=oska-prom.herokuapp.com request_id=4012bbf1-c4ec-46e9-bfd0-5d8fdb23c23d fwd="77.29.30.58" dyno=web.1 connect=0ms service=43ms status=500 bytes=470 protocol=https
2020-02-22T16:10:19.267659+00:00 heroku[router]: at=info method=GET path="/proverka" host=oska-prom.herokuapp.com request_id=ee6b17a9-a2b0-4b77-adaf-d967c48ace12 fwd="77.29.30.58" dyno=web.1 connect=0ms service=15ms status=200 bytes=2539 protocol=https
2020-02-22T16:10:19.269189+00:00 app[web.1]: 10.102.224.122 - - [22/Feb/2020:16:10:19 +0000] "GET /proverka HTTP/1.1" 200 2377 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
编辑 我上载了发生错误的视图代码。您能否建议另一种方法来替换硬编码路径或如何下载文件。
我要做的是用数据库中的数据创建excel电子表格,然后我希望用户将其打印或下载到他的计算机上。
答案 0 :(得分:0)
您对路径进行了硬编码:
os.startfile("C:\\Users\\Nenad\\Desktop\\magacin vs\\ISPRATNICI\\{}, {}.xlsx".format(s.id, s.ime))
使用os
,您可以构建相对路径,使其在Windows和Linux上均可使用。我们需要查看源代码以建议您如何正确构建路径。
话虽如此,看来您正在将数据写入一个文件,您稍后可能会使用它。 Heroku 不适合于此。
https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem
每个dyno都有自己的临时文件系统,其中包含新的 最近部署的代码。在dyno的一生中 进程可以将文件系统用作临时暂存器,但不能 写入的文件对于任何其他dyno和 测功机停止或停止时,所有写入的文件将被丢弃。 重新启动。例如,任何时候由于 应用程序部署,并且大约每天每天 动态管理。
Dynos每天重新启动一次。意味着您的数据将丢失。您需要适当的数据库或使用其他托管解决方案。
答案 1 :(得分:0)
我要做的是用数据库中的数据创建excel电子表格,然后我希望用户将其打印或下载到他的计算机上
os.startfile()
永远不会这样做。
它可能看起来像在开发中一样,但这仅仅是因为您的客户端和服务器在同一台计算机上运行。如果您将代码托管在Windows(存在os.startfile()
的Windows上并从另一台计算机连接到它,则您的服务器将尝试打开该文件。它根本不会显示在客户端上。
摆脱
os.startfile("C:\\Users\\Nenad\\Desktop\\magacin vs\\ISPRATNICI\\{}, {}.xlsx".format(s.id, s.ime))
完全。
相反,请以send_file
结尾:
from flask import send_file
@app.route("/proverka", methods=['GET', 'POST'])
def proverka():
# ...
send_file('ISPRATNICI\\{}, {}.xlsx'.format(s.id, s.ime))
正如Tin所说,Heroku's filesystem is ephemeral,因此服务器上的PDF将消失。如果可以的话,您可能不会遇到太多问题。如果有人在dyno重新启动之前请求PDF just ,则可能会有一些问题,但是他们应该能够再次请求它。