Pyexcel, загрузка файла для создания книги в памяти

Это решено; благодаря решению @vmontco: мне не хватало MEDIA_URL, теперь оно работает отлично. ---------- Оригинальный вопрос ниже -----------

Я приветствую предложения со всех сторон; Я довольно новичок в Django и Python. Я уверен, что мне не хватает чего-то простого.

Используя форму модели с FileField, я загружаю и сохраняю файл Excel в структуру папок в MEDIA_ROOT. Это работает.

Я хочу прочитать тот же файл позже, чтобы выполнить операции с использованием Pyexcel. Вот где я застрял. Я пытаюсь загрузить файл, используя FileField, хранящийся в БД.

Вот где у меня проблемы, и я не уверен, неправильно ли я понимаю MEDIA_ROOT или какой-то другой аспект Django.

Когда я передаю ПК во 2-й вид, я создаю экземпляр объекта на основе модели. У него есть FileField 'docfile', который я пытаюсь использовать для доступа к файлу для выполнения некоторых операций с использованием Pyexcel,

вот объявление FileField из models.py:

docfile = models.FileField(
    verbose_name="Choose file to upload:", 
    upload_to='Excel_CSV_Assets/%Y/%m/%d')

РЕДАКТИРОВАТЬ: Если я жестко запрограммировать pth в файл, как это, все работает, включая операции после:

thedocfile='site_static/site/original_assets/Excel_CSV_Assets/2016/04/23/Animals_oglc4DV.xlsx'
book=pyexcel.get_book(file_name=thedocfile)

: Конец редактирования

Вот код из второго представления, где я пытаюсь прочитать файл в память и создать объект класса 'book', используя Pyexcel. Я застрял здесь:

asset = Excel_CSV_Asset.objects.get(id=assetid)
book=pyexcel.get_book(file_name=asset.docfile)

Вот мое описание ошибки: неправильное имя файла ошибка

Вот информация прямо там, где ломается мой код:

Хотя в нем указано "Неверное имя файла", я вижу, что файл находится в папке: file_location_name_and_properties

Я могу открыть файл двойным щелчком мыши; файл не поврежден.

РЕДАКТИРОВАТЬ: Если я приведу "asset.docfile" в str, вот так:

asset = Excel_CSV_Asset.objects.get(id=assetid)
book=pyexcel.get_book(file_name=str(asset.docfile))

Я получаю другую ошибку:

[Errno 2] No such file or directory: 'Excel_CSV_Assets/2016/04/23/Animals_oglc4DV.xlsx'

... но это правильный каталог, расположенный под файловой структурой MEDIA_ROOT.

Вот settings.py MEDIA_ROOT:

MEDIA_ROOT = 'site_static/site/original_assets/'

Вот urls.py:

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^e/', include('excel_to_mongo.urls')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Вот url.py этого приложения:

url(r'^efactory/(?P<assetid>\d+)/$', 'display_sheet_column_choices', {}),

1 ответ

Решение

Я думаю, что ваша проблема в том, что вы не до конца понимаете управление медиафайлами с помощью Django.

Что такое медиа файлы?

Мультимедийные файлы - это все файлы, загруженные пользователем (во время выполнения).

Вы не должны путать их со статическими файлами, которые являются активами, необходимыми вашему проекту для работы и которые вы добавляете во время разработки (например, CSS, фоновое изображение и файлы JS).

Вы не должны смешивать их, потому что они по-разному управляются сервером, и это может привести к проблемам с безопасностью (см. Предупреждение здесь):

Статическое управление файлами:

Вы помещаете свои статические файлы как часть кода либо в один static подкаталог из установленных приложений django, либо в одном из мест, которые вы добавили в STATICFILES_DIRS,

Статические файлы должны быть собраны до запуска сервера путем вызова ./manage.py collectstatic эта команда будет собирать (копировать) статические файлы в каталог (STATIC_ROOT ценность).

Затем вы должны установить STATIC_URL выбрать с помощью которого вы должны обслуживать ваши статические файлы. Обычный выбор будет /static/, Чтобы получить доступ к статическому файлу, вы должны затем попытаться достичь /static/path/to/static/file/in/static_root/dir,

Управление медиа-файлами:

Ваши медиа-файлы добавляются во время выполнения. Они хранятся в MEDIA_ROOT место, которое должно быть абсолютным путем. Отсюда тот факт, что я предложил вам присоединиться к BASE_DIR значение (абсолютный путь) и подкаталог, который вы бы выбрали с чем-то вроде:

MEDIA_ROOT = os.path.join(BASE_DIR, "/media/subdir")

Затем вам нужно установить URL для ваших медиа-файлов, используя MEDIA_URL переменная. Чтобы получить доступ к вашим медиа-файлам, URL-адреса будут начинаться со значения, которое вы выберете:

MEDIA_URL = '/media/'

Затем добавьте это в свой файл urls.py:

if settings.DEBUG:
    urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

В текущем примере ваш mymediafile.txt будет расположен по адресу /path/to/your/project/media/subdir/path/in/media/root/mymediafile.txt и служил в http://127.0.0.1:8000/media/path/in/media/root/mymediafile.txt,

Но это подходит только для использования разработки, как сказано здесь. И это будет работать только для DEBUG == TRUE

Для производственного использования вы должны рассмотреть возможность развертывания медиа-файлов на вашем http-сервере (например, apache).

Заключение:

Потратьте время, чтобы понять это. Потому что я подозреваю, что вы на самом деле не поняли, что вы сделали, и это отсутствие понимания может привести к будущим ошибкам и ошибкам.

Другие вопросы по тегам