Django FileResponse保存后停止微调器



我有一个url的模板链接,它运行一个生成文件并返回FileResponse的视图函数。效果很好,但在某些情况下,生成文件可能需要一段时间,所以我想在之前和之后启动和停止微调器。

我尝试过在链接上使用点击事件来运行和发送url的$.ajax((或$.get((函数,这样我就可以启动微调器了。但是在这种情况下,FileResponse不会生成Save窗口。(代码如下(

有没有一种方法可以通过JavaScript在Django视图中生成和保存文件?以下内容永远不会打开文件保存窗口。

$("#ds_downloads a").click(function(e){
urly='/datasets/{{ds.id}}/augmented/'+$(this).attr('ref')
startDownloadSpinner()
$.ajax({
type: 'GET',
url: urly
}).done(function() {
spinner_dl.stop();
})
})

添加下面创建FileResponse的函数。这会生成一个本地系统文件保存窗口,允许用户在本地保存文件。打开或关闭(保存(该窗口的事件将是停止微调器的时候,但我似乎无法通过javascript访问它。

with open(fn, 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile, delimiter='t',
quotechar='', quoting=csv.QUOTE_NONE)
writer.writerow(['col1','col2','col3'])
for f in features:
geoms = f.geoms.all()
gobj = augGeom(geoms)
row = [
gobj['col1'],
gobj['col2'],
gobj['col3']]
writer.writerow(row)
response = FileResponse(open(fn, 'rb'),content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="'+os.path.basename(fn)+'"'

只需使用HttpResponse,浏览器就会自动添加微调器。无需添加额外的微调器。

from csv import writer
from django.http import HttpResponse
response = HttpResponse(content_type='text/csv')
response.status_code = 200
response["Content-Disposition"] = "attachment; filename={}".format(filename)
try:
csv_writer = writer(response)
# define headers
csv_writer.writerow(headers)
[csv_writer.writerow(row) for row in features.values_list(*headers)]
except Exception:
raise

return response

我想出了一个有点笨拙的解决方案:我用$.ajax向一个基于函数的视图生成POST请求,该视图启动一个Celery任务来执行文件创建并将其保存到文件系统。它在任务运行时向浏览器返回Celery task_id,并将其提供给celery_progress.js例程,该例程检查任务的进度,完成后返回文件名;在标记中创建一个href链接,并在其上生成一个click((。该ajax函数在适当的点启动和停止带有spinner.js的微调器。

不发布代码b/c是一个棘手的问题,我不建议这样做。我想用django表单有更好的方法可以做到这一点,但这很有效,项目已经过期,我没有时间再看了。

最新更新