【问题标题】:Copying .csv file located on Heroku server to local drive将位于 Heroku 服务器上的 .csv 文件复制到本地驱动器
【发布时间】:2019-09-16 08:23:29
【问题描述】:

我有一个 Python/Django Web 应用程序部署到 Heroku,它将信息写入 .csv 文件。

文件写入后,我想将其从 Heroku 服务器下拉到用户本地驱动器。

我不需要将文件保存在任何地方,因此我避免使用 S3 或存储在数据库中。

我使用了 Heroku "ps:copy" 命令,它可以工作,但这肯定意味着用户需要在他们的机器上安装 Heroku CLI 才能工作?

还有其他方法吗?

【问题讨论】:

  • 为什么不能让用户下载文件而不保存?
  • 用户可能需要 Heroku CLI 和您的服务器凭据。
  • 是的,这就是我希望他们能够做的,只需在服务器/dyno 上创建文件后立即下载文件。
  • 是否可以生成临时链接,生成文件,立即下载,然后删除文件?
  • 是的,除了删除部分。该文件在 Dyno 上持续存在,直到重新启动 Dyno 或应用程序由于不活动而休眠(免费 Heroku 帐户)。这对于它的用途来说已经足够长了。

标签: python django heroku-cli


【解决方案1】:

我已粘贴下面的代码,该代码当前使用与 Django QuerySets 配合使用的 djqscsv 库生成 .csv:

# Generate report filename
filename = djqscsv.generate_filename(qs, append_datestamp=True)

# Generate report
try:
    with open(filename, 'ab') as csv_file:
        print(filename)
        write_csv(qs, csv_file)
        messages.success(request, 'Consultation added to report successfully!')
        messages.warning(request, 'Note: Certain needs may not appear in report, \
                                         this is a result of filtering process.')

所以一旦“csv_file”被写入,我就会重定向到你上面描述的“csv_view”,显然不写任何进一步的行?

【讨论】:

    【解决方案2】:

    这应该可以解决问题。当发送到 csv_view 时,Django 会生成一个 CSV 并让它自动下载到客户端的浏览器。

    您提供的代码:

    # Generate report filename
    filename = djqscsv.generate_filename(qs, append_datestamp=True)
    
    # Generate report
    try:
        with open(filename, 'ab') as csv_file:
            print(filename)
            write_csv(qs, csv_file)
            messages.success(request, 'Consultation added to report successfully!')
            messages.warning(request, 'Note: Certain needs may not appear in report, \
                                             this is a result of filtering process.')
    

    您需要将此代码与我的代码合并到同一个视图中。

    def csv_view(request):
        filename =  djqscsv.generate_filename(qs, append_datestamp=True)
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="{}.csv"',format(filename)
        writer = csv.writer(response)
        writer.writerow(qs) #use a for loop if you have multiple rows
        messages.success(request, 'Consultation added to report successfully!')
        messages.warning(request, 'Note: Certain needs may not appear in report, \
                                             this is a result of filtering process.')
    
        return response
    

    需要明确的是,csv_view 是生成 CSV 的位置,而不仅仅是指向在另一个视图中生成的 CSV 的链接。

    此方法也不会将 CSV 保存到 Dyno。我认为它确实如此,之后只是将其删除,但我认为它不会将其保存到服务器上。

    【讨论】:

    • 没问题。如果此答案解决了您的问题,请单击我的答案右侧的复选标记,以便所有人都知道此问题已解决。
    • 试过了,但它只是在浏览器中呈现文本。使用 Safari,尝试使用 Chrome,但出现 ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION 错误(可以解决但尚未尝试过。
    • 你的请求怎么样?
    • t = (request.user.username) qs = Need.objects.filter(user_id=t)
    • 设法通过一些更改来实施您的代码建议,并且效果很好。但是,是否可以返回启动 csv 文件下载然后重定向到主页的响应?
    【解决方案3】:

    发现 djqscsv 库包含解决问题的 render_to_csv_response:

    # Generate file name from QuerySet
    filename =  djqscsv.generate_filename(qs, append_datestamp=True)
    
    # Autodownload csv file in browser
    return render_to_csv_response(qs, filename=filename)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2021-07-29
      • 2016-12-28
      • 1970-01-01
      • 2017-01-03
      • 2021-09-01
      • 2018-12-02
      相关资源
      最近更新 更多