Django implementiert die Funktion zum Herunterladen von Dateien

Django bietet drei Möglichkeiten, die Funktion zum Herunterladen von Dateien zu realisieren: HttpResponse, StreamingHttpResponse und FileResponse. Die Beschreibung der drei lautet wie folgt:

  • HttpResponse ist die Kernklasse aller Antwortprozesse und die zugrunde liegende Funktionsklasse ist HttpResponseBase.
  • StreamingHttpResponse wird auf der Grundlage von HttpResponseBase geerbt und neu geschrieben. Es implementiert die Streaming-Antwortausgabe (die Streaming-Antwortausgabe verwendet Python-Iteratoren, um Daten in Segmenten zu verarbeiten und zu übertragen) und eignet sich für umfangreiche Datenantworten und Dateitransportantworten.
  • FileResponse wird auf der Grundlage von StreamingHttpResponse geerbt und neu geschrieben, wodurch die Ausgabe von Streaming-Antworten auf Dateien realisiert wird und nur auf Dateiübertragungsantworten anwendbar ist.

Der Unterschied zwischen HttpResponse, StreamingHttpResponse und FileResponse:

  • HttpResponse hat viele Nachteile bei der Realisierung des Datei-Downloads: Sein Arbeitsprinzip besteht darin, die Datei zu lesen und in den Speicher zu laden und sie dann an den Browser auszugeben, um die Download-Funktion zu realisieren. Diese Methode kann viel Speicher verbrauchen, wenn die Datei groß ist. Zum Herunterladen großer Dateien empfiehlt Django die Verwendung der Methoden StreamingHttpResponse und FileResponse. Diese beiden Methoden schreiben die heruntergeladenen Dateien stapelweise auf die lokale Festplatte des Servers, um den Speicherverbrauch zu reduzieren.
  • Die Implementierungsprinzipien von StreamingHttpResponse und FileResponse sind dieselben: Beide schreiben die heruntergeladenen Dateien stapelweise auf die lokale Festplatte, um die Streaming-Antwortausgabe der Dateien zu realisieren.
  • In Bezug auf den Anwendungsbereich verfügt StreamingHttpResponse über einen größeren Anwendungsbereich und kann umfangreiche Daten- oder Dateiausgaben unterstützen, während FileResponse nur die Dateiausgabe unterstützt.
  • Da StreamingHttpResponse die Daten- oder Dateiausgabe unterstützt, müssen bei der Verwendung der Antwortausgabetyp und die Methode festgelegt werden, während FileResponse nur drei Parameter festlegen muss, um die Funktion zum Herunterladen von Dateien zu realisieren.

 Routing-Konfiguration in urls.py von myApp:

#myApp urls.py

from argparse import Namespace
from operator import index
from django.urls import path,re_path,include
from . import views
from django.views.generic import RedirectView

urlpatterns = [
    path("",views.index,name="index"),
    path("download/file1",views.download1,name="download1"),
    path("download/file2",views.download2,name="download2"),
    path("download/file3",views.download3,name="download3"),

]

#配置全局404页面
handler404 = "myApp.views.page_not_found"

#配置全局500页面
handler500 = "myApp.views.page_error"

Unter der myApp-Anwendung kann view.py die Download-Funktion über HttpResponse, StreamingHttpResponse und FileResponse realisieren:

from django.shortcuts import render
from django.shortcuts import reverse
from django.urls import resolve

#文件下载包
from django.http import HttpResponse,Http404
from django.http import StreamingHttpResponse
from django.http import FileResponse

# Create your views here.

def index(request):
    # return redirect("index:shop",permanent=True)
    return render(request,"index.html")

def download1(request):
    #服务器上存放文件的路径
    file_path = r"E:\myDjango\file\1.jpg"
    try:
        r = HttpResponse(open(file_path,"rb"))
        print(r)
        r["content_type"]="application/octet-stream"
        r["Content-Disposition"]="attachment;filename=1.jpg"
        return r
    except Exception:
        raise Http404("Download error")


def download2(request):
    file_path = r"E:\myDjango\file\2.jpg"
    try:
        r = StreamingHttpResponse(open(file_path,"rb"))
        r["content_type"]="application/octet-stream"
        r["Content-Disposition"]="attachment;filename=2.jpg"
        return r
    except Exception:
        raise Http404("Download error")


def download3(request):
    file_path = r"E:\myDjango\file\3.jpg"
    try:
        f = open(file_path,"rb")
        r = FileResponse(f,as_attachment=True,filename="3.jpg")
        return r
    except Exception:
        raise Http404("Download error")

Beschreibung der StreamingHttpResponse-Funktion:

StreamingHttpResponse-Initialisierungsparameter „streaming_content“ und formale Parameter *args, **kwargs. Das Datenformat des Parameters „streaming_content“ kann als Iteratorobjekt oder Bytestream festgelegt werden, der Daten oder Dateiinhalte darstellt. *args, **kwargs legen die Parameter von HttpResponseBase fest, dh das Datenformat content_type des Antwortinhalts und den Status des Antwortstatuscodes sowie andere Parameter.

Beschreibung der FileResponse-Funktion:

FileResponse-Initialisierungsparameter as_attachment und filename.

  • Der Datentyp des Parameters as_attachment ist boolesch. Wenn er falsch ist, wird die Funktion zum Herunterladen von Dateien nicht bereitgestellt. Die Datei wird im Browser geöffnet und gelesen. Wenn der Browser die Datei nicht öffnen kann, wird die Datei heruntergeladen Der lokale Computer ist jedoch nicht vorhanden. Legen Sie das Dateinamensuffix fest. Wenn True, aktivieren Sie die Funktion zum Herunterladen von Dateien, laden Sie die Datei auf den lokalen Computer herunter und legen Sie das Dateisuffix fest.
  • Der Parameter Dateiname legt den Dateinamen der heruntergeladenen Datei fest, der mit der Einstellung des Parameters as_attachment zusammenhängt. Wenn der Parameter as_attachment False ist, hat der Parameter filename keine Auswirkung. Unter der Voraussetzung, dass as_attachment True ist und filename leer ist, wird der ursprüngliche Dateiname der Datei als Dateiname der heruntergeladenen Datei verwendet. Andernfalls wird der Parameter verwendet Dateiname wird als Dateiname der heruntergeladenen Datei verwendet. Dateiname.
  • Die formalen Parameter *agrs und **kwargs werden verwendet, um die Parameter von HttpResponseBase festzulegen, dh das Datenformat content_type des Antwortinhalts und den Status des Antwortstatuscodes sowie andere Parameter.

Der Seiten-Download-Code in der Vorlage:

<html>
    <header>
        <title>首页文件下载</title>
    </header>

<body>
        <a href="{%url 'myApp:download1' %}">下载1</a>
        <a href="{%url 'myApp:download2' %}">下载2</a>
        <a href="{%url 'myApp:download3' %}">下载3</a>
</body>

</html>

Guess you like

Origin blog.csdn.net/qq_38563206/article/details/126766962