Объединенный путь (относительный путь) находится за пределами компонента базового пути (полный путь) - PullRequest
0 голосов
/ 14 февраля 2019

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

Нет проблем, яЯ просто скопировал мои изображения в каталог мультимедиа, который, я думал, решит проблему, но нет, проблема остается.

Судя по тому, что я могу сказать, кажется, что проблема заключается в наличии относительного пути по сравнению с полнымпуть?

Полная ошибка:

SuspiciousFileOperation at /toys/
The joined path (/media/images/test.jpg) is located outside of the base path component (/home/username/django/first_webapp/my_site/media)

Путь /home/username/django/first_webapp/my_site/media/images/test.jpg действителен, а test.jpg являетсядействительное изображение jpg.

Сокращенный код, который я использую в своем шаблоне с sorl-thumbnail (хотя я также пробовал с easy_thumbnails):

{% for instance in prods %}
    <img src=" {% thumbnail instance.image_url 300x300 %} "> 
{% endfor %}

instance.image_url, в этомcase, имеет значение /media/images/test.jpg

Мои настройки каталога мультимедиа из моего файла settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

Я не уверен, с чего начать устранение неполадок.

1 Ответ

0 голосов
/ 14 февраля 2019

Я не могу понять, как вы думаете, тип поля не имеет значения.Конечно, это так.

В вашем случае (по какой-то причине) вы использовали TextField для хранения пути к файлу изображения.TextFields не имеет специальных знаний о медиа-файлах, а sort-thumbnail просто обрабатывает содержимое как компонент пути, который затем присоединяется к MEDIA_ROOT.Но так как ваш путь начинается с косой черты, результат os.path.join(MEDIA_ROOT, path) равен просто path;начальная косая черта в точности означает «начать с корня файловой системы».Таким образом, в результате получается путь за пределы вашего проекта, который Django запрещает по соображениям безопасности.

Быстрое решение состоит в том, чтобы удалить косую черту, а также дубликат префикса «media», и просто сохранить «images / test».jpg».Но реальное исправление состоит в том, чтобы использовать соответствующее поле для содержимого, которое вы храните, и позволить этому полю управлять им за вас.

...