簡體   English   中英

如何使用 Django 下載 xlsx 文件?

[英]How do I download xlsx file with Django?

我試圖制作一個使用 Django 下載.xlsx文件的按鈕,所以我遵循了本教程: https : //xlsxwriter.readthedocs.io/example_django_simple.html

現在我有一個 HTTP 響應,但沒有顯示下載提示。

這是我的代碼的一些部分:

視圖.py:

def xlsx(request):
    if request.method == "POST":
        output = io.BytesIO()
        workbook = xlsxwriter.Workbook(output)
        worksheet = workbook.add_worksheet("hello")
        worksheet.write(0,0, 'Client')
        workbook.close()
        output.seek(0)

    filename = 'EdedocBilling.xlsx'
    response =  HttpResponse(output, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
    return response

索引.html

<form>...</form>
<button type = "button" id = "saveID"
    onclick = "$.ajax({
        type: 'POST',
        url: 'xlsx',
        async: false,
        data: $('form').serialize(),
        success : console.log(' Success')
    })">
    Generate
</button>

我刪除了處理數據的代碼,因為生成的.xlsx工作正常。 (我測試了在服務器上創建文件並成功。)

以下是 HTTP 響應標頭:

HTTP/1.1 200 OK
Date: Thu, 08 Jul 2021 14:47:37 GMT
Server: WSGIServer/0.2 CPython/3.8.8
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content-Disposition: attachment; filename="EdedocBilling.xlsx"
X-Frame-Options: DENY
Content-Length: 5252
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin

有人有解決方案嗎? 謝謝!

這是由於 AJAX 的性質以及瀏覽器如何處理所有這些。

查看問題的不同答案是否可以使用 HTTP POST 下載文件? .

使用媒體和 URL 模式

在 POST 請求的響應中返回一個 URL,並實現一個傳遞文件內容的 URL 模式。

這當然需要更多的努力,但如果您的網站必須擴展,這將是一個很好的解決方案。

腳步:

  1. 為 Excel 工作表創建一個 Django 模型並將生成的文件存儲在 MEDIA 文件夾中:有關如何執行此操作的詳細信息,請參閱https://docs.djangoproject.com/en/3.2/topics/files/ 該模型至少應該有一個 slug 和一個文件字段,如果您希望訪問權限僅是臨時可用的,則可能還有一個用於處理到期的日期字段。
  2. 在您的 urls.py 中創建一個標識特定 excel 的路由,例如 /generated/slug:slug.xls。 在返回此路由的模型上實現get_absolute_url()
  3. 從你的 post 請求不返回生成的文件,而是返回 obj.get_absolute_url 的結果作為要在 JS 中處理的文本內容。
  4. 在您的 AJAX 成功處理程序中,將瀏覽器重定向到此 URL。
  5. 在此路由的視圖中,返回文件。 您還可以在此處檢查授權和到期時間。

在生產設置中,您還可以配置您的反向代理(例如 nginx)來交付文件,並且您的 Django 視圖僅設置一個標頭(X-Accel-Redirect),指示代理要交付哪個文件。 有關更多信息,請參閱https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM