TypeError при попытке доступа к любому файлу в каталоге статического носителя

Я пытаюсь загрузить изображение JPG из каталога мультимедиа на свой сервер Django.

У меня нет проблем с загрузкой css из STATIC_ROOT, но я не могу получить доступ к изображениям и css из MEDIA_ROOT. Ни из приложения, ни из браузера

Я использую библиотеку PILL для создания эскиза и сглаживания изображения перед его сохранением, загрузка проходит нормально, и изображение копируется в мой MEDIA_ROOT. Но приложение по-прежнему не может получить к нему доступ. Утилита отладки в браузере (Firebug) сообщает, что «не удалось загрузить изображение», но URL-адрес внутри ссылки полностью правильный.

Это ошибка, которую я получаю, пытаясь открыть файл в браузере:

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/media/images/django_img.jpg

Django Version: 1.4c1
Python Version: 2.7.0
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.flatpages',
'django.contrib.admin',
'todo',
'blog',
'forum')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')


    Traceback:

    File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)

    File "C:\Python27\lib\site-packages\django\views\static.py" in serve
  48.     fullpath = os.path.join(document_root, newpath)

    File "C:\Python27\lib\ntpath.py" in join
  96.             assert len(path) > 0

    Exception Type: TypeError at /media/images/django_img.jpg
    Exception Value: object of type 'NoneType' has no len()

The server tells the problem is in C:\Python27\lib\ntpath.py in join. 

At line 96 <code>
# Join, and ensure there's a separator.
assert len(path) > 0

The url is a unicode string stored into img variable.

Как возможно, что приложение правильно пишет шаблон, изображение есть, MEDIA_URL настроен и работает правильно, но изображение все равно не загружается в браузер?

Вот мой 'urls.py', как меня любезно попросили:

from django.conf.urls import patterns, include, url
from django.conf import settings

from django.conf.urls.defaults import *
from django.utils.translation import ugettext as _

import os


# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()


urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    (r"^forum/(\d+)/$", "forum.views.forum"),
    (r"^thread/(\d+)/$", "forum.views.thread"),
    (r"^post/(new_thread|reply)/(\d+)/$", "forum.views.post"),
    (r"^reply/(\d+)/$", "forum.views.reply"),
    (r"^new_thread/(\d+)/$", "forum.views.new_thread"),
    (r"^profile/(\d+)/$", "forum.views.profile"),
    (r'^media/(?P<path>.*)$', 'django.views.static.serve'),

    (r"", "forum.views.main"),


)

if settings.DEBUG:
    # serving the media files for dojango / dojo (js/css/...)
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve',
            {'document_root': os.path.join(os.path.dirname(__file__), "media")}),
    )

Когда я просматриваю это представление, приложение работает хорошо и загружает изображение, но изображение не загружается в представление, а также в другие представления:

def profile(request, pk):

    profile = UserProfile.objects.get(user=pk)
    img = None # I tried to insert here an empty string but no result

    if request.method == "POST":
        pf = ProfileForm(request.POST, request.FILES, instance=profile)
        if pf.is_valid():
            pf.save()
            # resize and save image under same filename
            imfn = pjoin(MEDIA_ROOT, profile.avatar.name)
            im = PImage.open(imfn)
            im.thumbnail((160,160), PImage.ANTIALIAS)
            im.save(imfn, "JPEG")
    else:
        pf = ProfileForm(instance=profile)

    if profile.avatar:
        img = "/media/" + profile.avatar.name

    return render_to_response("forum/profile.html", add_csrf(request, pf=pf, img=img))

Спасибо за ваше время


person LorenzoDaPonte    schedule 24.03.2012    source источник
comment
Обновите вопрос, указав свое представление, которое вызывает исключение, и полную трассировку исключения.   -  person Burhan Khalid    schedule 24.03.2012
comment
Укажите settings.py и urls.py, если вы обслуживаете статические файлы с помощью Django.   -  person Mariusz Jamro    schedule 25.03.2012
comment
я опубликую свой 'urls.py'. «setting.py» является стандартным, предоставленным «django-admin». И переменные для статического файла установлены правильно, потому что файл загружается.   -  person LorenzoDaPonte    schedule 25.03.2012
comment
Я думаю, что полная трассировка - это то, что я опубликовал.   -  person LorenzoDaPonte    schedule 25.03.2012


Ответы (1)


У вас есть 2 вызова django.views.static.serve в ваших URL-адресах, первый не снабжен document_root, поэтому предполагается None, и это вызывает исключение на os.path.join

person ilvar    schedule 25.03.2012
comment
Попытка получить доступ к MEDIA_ROOT любым браузером из панели администратора django. Если я удалю settings.DEBUG(), меня перенаправят на forum.views.forum. Если я удалю строку внутри urlpattens, я получу ту же ошибку, что и выше. - person LorenzoDaPonte; 25.03.2012
comment
Вы должны оставить только одну строку для медиа (лучше вторую) и установить шаблон для forums.views.main что-то вроде r'^$'. Текущий шаблон main соответствует любому пути. Если вы хотите оставить первую строку для media, вы должны добавить к ней параметр document_root. - person ilvar; 26.03.2012