Что ж, небольшой перебор в коде показывает, что может быть более глубокое сообщение об ошибке, которое было гомогенизировано на этом пути.
в django / core / files / storage.py, строка 210 (это в 1.1.1) у нас есть:
def path(self, name):
try:
path = safe_join(self.location, name)
except ValueError:
raise SuspiciousOperation("Attempted access to '%s' denied." % name)
return smart_str(os.path.normpath(path))
Итак, ошибка должна выходить из safe_join ().
В django / utils / _os.py у нас есть следующее. Обратите внимание на ошибку ValueError, которая выводится с третьей по последнюю строку:
===========================
def safe_join(base, *paths):
"""
Joins one or more path components to the base path component intelligently.
Returns a normalized, absolute version of the final path.
The final path must be located inside of the base path component (otherwise
a ValueError is raised).
"""
# We need to use normcase to ensure we don't false-negative on case
# insensitive operating systems (like Windows).
base = force_unicode(base)
paths = [force_unicode(p) for p in paths]
final_path = normcase(abspathu(join(base, *paths)))
base_path = normcase(abspathu(base))
base_path_len = len(base_path)
# Ensure final_path starts with base_path and that the next character after
# the final path is os.sep (or nothing, in which case final_path must be
# equal to base_path).
if not final_path.startswith(base_path) \
or final_path[base_path_len:base_path_len+1] not in ('', sep):
raise ValueError('the joined path is located outside of the base path'
' component')
return final_path
==================
Хммм, "Объединенный путь расположен вне компонента базового пути". Теперь есть пара вызовов abspathu () (она определена чуть выше этой процедуры и отличается для NT от других ОС). abspathu () преобразует все неабсолютные пути в абсолютные, добавив os.cwdu (), текущий рабочий каталог.
Вопрос: У вас случайно есть символическая ссылка (символическая ссылка) на ваш медиа-каталог? Другими словами, это не прямой потомок каталога проекта? Я не знаю, если это правильный вопрос, он просто выпал из моей головы.
Вопрос: Какие являются значениями self.location
и name
, которые передаются в safe_join ()?
Wild-ass-догадка: self.location
пусто?
Еще одно безумное предположение: MEDIA_ROOT как-то изменилось на /media/
?
Если у вас установлена собственная копия Django (это не сложно сделать), попробуйте добавить в эти подпрограммы некоторые операторы печати, а затем запустите ее в качестве сервера разработки. Вывод на печать поступит на консоль.
Обновление: Хммм. Вы сказали: «2) Значения для self.location и name: / home / tsoporan / site / media и /media/albums/anthem-for-the-underdog/30103635.jpg"
Имеет ли смысл следующий путь?
"/home/tsoporan/site/media/media/albums/anthem-for-the-underdog"
Обратите внимание на ... / media / media / ... там.
Кроме того, что это за ОС? Джанго, рев?