Представление Django для загрузки файла с сервера

У меня есть views.py, который:

  • создает несколько файлов .xlsx
  • выбирает нужный .zip и помещает файл внутрь

После этого я хочу, чтобы этот .zip автоматически загружался. Я провел некоторые исследования и протестировал несколько кодов, но ни один не сработал.

Я создал папку "temp" в корне приложения, где хранятся созданные файлы.

упрощенный view.py

def generate_ws(request,cource,ca_id):
    ca = get_object_or_404(CreditAnalysis,pk=ca_id)
    ca_owners = CAOwner.objects.filter(ca_operation=ca)
    mo_farms = MOFarm.objects.filter(ca_operation=ca)
    misses = []

    generate_owner_mo(ca_owner,misses,city)
    zip_name = 'temp/MOs - ' + str(ca_owner.owner) + '.zip'
    zf = zipfile.ZipFile(zip_name,'w')
    zf.close()

    generate_farm_mo(mo_farm,misses,city)
    generate_production_mo(ca,misses,city,production_city,pks)

    files = glob.glob('temp/*.xlsx')
    for file in files:
        file_key = file.split('.')[0]
        file_key=file_key.split(' - ')
        for ca_owner in ca_owners:
            zip_name = 'temp/MOs - ' + str(ca_owner.owner) + '.zip'
            if str(ca_owner.owner) in file_key:
                zf = zipfile.ZipFile(zip_name,'a')
                new_file_name = file[5:]
                zf.write(file,new_file_name)
                zf.close()                
                break
     files = glob.glob('temp/*.zip')            
     for file in files:
         download_mo(request,file)

    misses = list(set(misses))

    return render(request,'generate_mo.html',{'misses':misses,})

download_mo

def download_mo(request,file):
    path_to_file = os.path.realpath(file)
    with open(path_to_file,'rb') as fh:
        response = HttpResponse(fh.read())
        file_name = file[5:]
        response['Content-Disposition'] = 'inline; filename=' + file_name
        return response

Все работает правильно, кроме загрузки, которая никогда не начинается

Просто верните FileResponse вместо HttpResponse :

from django.http import FileResponse
def download_mo(request,file):
    path_to_file = os.path.realpath(file)
    response = FileResponse(open(path_to_file, 'rb'))
    file_name = file[5:]
    response['Content-Disposition'] = 'inline; filename=' + file_name
    return response
Вернуться на верх