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)
Вот информация прямо там, где ломается мой код:
Хотя в нем указано "Неверное имя файла", я вижу, что файл находится в папке:
Я могу открыть файл двойным щелчком мыши; файл не поврежден.
РЕДАКТИРОВАТЬ: Если я приведу "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).
Заключение:
Потратьте время, чтобы понять это. Потому что я подозреваю, что вы на самом деле не поняли, что вы сделали, и это отсутствие понимания может привести к будущим ошибкам и ошибкам.