Python 将Heroku服务器上的.csv文件复制到本地驱动器

Python 将Heroku服务器上的.csv文件复制到本地驱动器,python,django,heroku-cli,Python,Django,Heroku Cli,我在Heroku上部署了一个Python/Django web应用程序,它将信息写入.csv文件 一旦文件被写入,我想把它从Heroku服务器拉到用户本地驱动器 我不需要将文件保存在任何地方,因此我避免使用S3或存储在数据库中 我使用了Heroku“ps:copy”命令,它可以工作,但这肯定意味着用户需要在他们的机器上安装Heroku CLI才能工作 还有别的办法吗?这就可以了。当发送到csv_视图时,Django生成一个csv,并将其自动下载到客户端的浏览器中 您提供的代码: # Genera

我在Heroku上部署了一个Python/Django web应用程序,它将信息写入.csv文件

一旦文件被写入,我想把它从Heroku服务器拉到用户本地驱动器

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

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


还有别的办法吗?

这就可以了。当发送到csv_视图时,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_视图
是生成csv的地方,而不仅仅是指向在另一个视图中生成的csv的链接


此方法也不会将CSV保存到Dyno。我以为是的,后来就删除了,但我不认为它会保存到服务器上

这应该能奏效。当发送到csv_视图时,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_视图
是生成csv的地方,而不仅仅是指向在另一个视图中生成的csv的链接


此方法也不会将CSV保存到Dyno。我以为是的,后来就删除了,但我不认为它会保存到服务器上

我粘贴了下面的代码,该代码当前使用与Django QuerySet一起使用的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_文件”被写入,我就会重定向到您上面描述的“csv_视图”,显然不会再写入任何行。

我已经粘贴了下面的代码,该代码当前使用与Django QuerySet一起使用的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_文件”被写入,我就会重定向到上面描述的“csv_视图”,显然不需要再写入任何行。

发现djqscsv库中包含了render_to_csv_响应,这解决了问题:

# 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)

发现djqscsv库包含render_to_csv_响应,解决了以下问题:

# 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)


为什么您不能让用户下载文件而不保存它?用户可能需要Heroku CLI和您的服务器凭据。是的,我希望他们能够做到这一点,在服务器/dyno上创建文件后立即下载文件。是否可以生成临时链接,生成文件,立即下载,然后删除该文件?是的,除了删除部分之外。该文件在Dyno上持续存在,直到Dyno重新启动或应用程序因不活动而休眠(免费Heroku帐户)。这对于它的用途来说已经足够长了。为什么不能让用户下载文件而不保存它?用户可能需要Heroku CLI和您的凭据才能访问服务器。是的,我希望他们能够做到这一点,只要在服务器/dyno上创建文件后立即下载即可。是否可以生成临时链接,生成文件,立即下载,然后删除文件?是的,删除部分除外。该文件在Dyno上持续存在,直到Dyno重新启动或应用程序因不活动而休眠(免费Heroku帐户)。这足够长,可以用来做什么。没问题。如果此答案解决了您的问题,请单击“我的答案”右侧的复选标记,以便所有人都知道此问题已解决。尝试过此答案,但它仅在浏览器中呈现文本。使用Safari时,尝试使用Chrome,但出现了一个ERR\u RESPONSE\u HEADERS\u MULTIPLE\u CONTENT\u DISPOSITION错误(可解决但尚未尝试此错误)。您如何处理请求?t=(request.user.username)qs=Need.objects.filter(user\u id=t)通过几处更改成功实现了您的代码建议,效果良好。但是,是否可以返回启动csv文件下载的响应,然后重定向到主页?没问题。如果此答案解决了您的问题,请单击我的答案右侧的复选标记,以便所有人都知道此问题已解决。尝试过它,但它只是在浏览器中呈现文本。使用Safari,尝试过使用Chrome,但得到了一个错误\u响应\u标题\u多内容\u处置错误(这是可解决的,但尚未尝试。您如何处理请求?t=(request.user.username)qs=Need.objects.filter(user\u id=t)通过几处更改成功地实现了您的代码建议,并且效果良好。但是,是否可以返回启动csv文件下载的响应,然后重定向到主页?