【问题标题】:export search results to csv file after displaying it in browser在浏览器中显示后将搜索结果导出到 csv 文件
【发布时间】:2016-02-18 16:17:14
【问题描述】:

我已经尝试解决这个问题一周了,但找不到合适的解决方案。 我有一个搜索栏来输入基因 ID(或者上传文件)。然后它查询数据库并返回这些基因之间的相互作用。我们将这些交互显示在 html 页面上的矩阵中。 (我基本上是返回一个python数组)。

现在我想包含一个导出按钮,以将矩阵/表格下载到 csv 或文本文件中,以便用户可以对其进行操作以进行进一步研究。

如何在不将每个查询结果保存在文件中的情况下执行此操作? 因为返回矩阵后,python脚本(views.py)已经运行,基因id也没有了。

可以用jQuery做吗?

非常感谢您的帮助。

【问题讨论】:

  • 视图返回搜索需要多长时间?
  • 对于少数 id 来说真的很快,对于大文件来说是 1-2 分钟
  • 我认为您对此无能为力,因为 http 请求/响应是无状态的,如果不使用外部缓存,您将无法记录结果。即使您有缓存,如果 1000 个用户同时下载 csv,您的缓存也会受到影响。最好的办法是优化视图函数,以便更快地返回结果。然后您的下载 csv 函数将再次调用视图以应用相同的逻辑但返回 csv。
  • 好的,但这是我的问题:下载 csv 函数如何再次调用视图?我从哪里得到请求?我不希望用户再次输入基因 ID。
  • 你是用GET的方法来提取用户输入的吧?

标签: python django csv download export


【解决方案1】:

您只需要提供一个包含当前 url 和一个标志的链接,以表明它是下载 csv 请求而不是呈现页面请求:

def return_result(request):
    # your original query
    query = request.GET.get('id', None)
    if query:
        results = Model.objects.filter(field=query)

    response = request.GET.get('download', None)
    if response == 'csv':
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
        # create a csv
        return response
    else:
        context = {'results': results}
        return render(request, 'results.html', context)

在您的页面中,您创建一个下载 csv 的链接,{{ request.get_full_path }} 是从请求中获取当前 url:

<a href="{{ request.get_full_path }}&download=csv">Download as CSV</a>

【讨论】:

  • 谢谢。我试过了,它给了我一个空文件,里面有这个代码if response == 'csv': response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="results.csv"' writer=csv.writer(response) writer.writerow(['this','is','the','first','row']) writer.writerow(['1','2','3','4','5']) return response
  • 我查看了 django 文档,我真的不明白为什么当我使用与那里使用的完全相同的代码时会得到一个空的 csv 文件?
  • 好的,我通过将其移动到单独的函数来修复它。我不知道为什么它不起作用。
猜你喜欢
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多