TypeError при попытке доступа к любому файлу в каталоге статических носителей - PullRequest
0 голосов
/ 24 марта 2012

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

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

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

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

Environment:</p> <pre><code>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)

    <b>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()</b>

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

URL-адрес - это строка в Unicode, сохраненная в переменной img.

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

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

</p> <pre><code>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):</p> <pre><code> 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))

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

1 Ответ

0 голосов
/ 25 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...