Как лучше всего преобразовать CSV-файл в Excel?

Чтобы лучше познакомиться с django, я решил создать веб-сайт, который позволит пользователю загружать файл csv, который затем будет преобразован в excel, и пользователь сможет его загрузить.

Для этого я создал модельную форму с одним model FileField с именем csv_file, как показано ниже:

#models.py

class CSVUpload(models.Model):
    csv_file = models.FileField(upload_to="csvupload/")

    def __str__(self):
        return self.csv_file


#forms.py   
class CsvForm(forms.ModelForm):
    class Meta:
        model = CSVUpload
        fields = ('csv_file', )

и соответствующее представление:

from django.shortcuts import render, redirect
import pandas as pd
import os

#converts file from csv to excel  
def convertcsv2excel(filename):
    fpath = os.path.join(settings.MEDIA_ROOT + "\csvupload", filename)
    df = pd.read_csv(fpath)
    newfilename = str(filename) +".xlsx"
    newpathfile = os.path.join(settings.MEDIA_ROOT, newfilename)
    df.to_excel(newpathfile, encoding='utf-8', index=False)
    return newfilename

def csvtoexcel(request):
    if request.method == 'POST':
        form = CsvForm(request.POST, request.FILES)
        if form.is_valid():
           form.save()
           print(form.cleaned_data['csv_file'].name)
           convertcsv2excel(form.cleaned_data['csv_file'].name)
           return redirect('exceltocsv')
    else:
        form = CsvForm()
    return render(request, 'xmlconverter/csvtoexcel.html',{'form': form})

прямо сейчас, как вы можете видеть, я использую Pandas, чтобы преобразовать файл csv, чтобы он преуспел внутри файла views.py. Мой вопрос: есть ли лучший способ сделать это (например, в модуле формы или модели), чтобы сделать файл Excel более эффективным для загрузки?

Я ценю любую помощь, которую вы можете оказать!


person marialadelbario    schedule 24.06.2019    source источник


Ответы (1)


Во-первых, я хочу указать, что ваш пример демонстрирует уязвимость при загрузке произвольного файла. Pandas не проверяет формат файла за вас, поэтому как злоумышленник я могу просто загрузить что-то вроде malware.php.csv в ваш скрипт преобразования, и любой вредоносный код, который я включу, останется нетронутым. Поскольку вы не проверяете, действительно ли содержимое этого файла находится в формате CSV, вы даете пользователям возможность напрямую загрузить файл с произвольным расширением и, возможно, выполнить код на вашем веб-сайте. Поскольку вы визуализируете формат xlsx на веб-странице таким, какой вы есть, есть большая вероятность, что кто-то может этим злоупотребить. Если это просто ваш личный эксперимент, чтобы помочь себе познакомиться, это одно, но я настоятельно не рекомендую развертывать его в производственной среде. То, что вы здесь делаете, очень опасно.

Что касается вашей более насущной проблемы, я лично не знаком с Django, но это очень похоже на этот вопрос: Django обслуживает загружаемые файлы

В вашем случае вы не хотите фактически сохранять содержимое файла на своем сервере, а скорее хотите обработать содержимое файла и вернуть его в теле ответа. Модуль django smartfile выглядит именно так: https://github.com/smartfile/django-transfer

Это предоставляет компоненты для Apache, Nginx и lighttpd и должно позволить вам предоставить средства для предоставления файлов в ответ сразу после запроса на загрузку / преобразование файла. Я должен подчеркнуть, что вы должны быть очень осторожны с тем, где вы сохраняете эти файлы, проверяя их содержимое, гарантируя, что конечные пользователи не могут просматривать или выполнять эти файлы в контексте веб-сервера, и что они удаляются сразу после ответа и файла. успешно отправлено.

Кто-то, более знакомый с Django, может поправить меня или предоставить полезный пример кода, но, по моему опыту, такой вид функциональности - это то, как вы вводите выполнение кода на свой сайт. Обычно это плохая идея.

person True Daemon    schedule 24.06.2019