Почему Django не может найти мои административные медиа-файлы после того, как я покинул встроенный сервер запуска? - PullRequest
3 голосов
/ 13 июня 2010

Когда я использовал встроенный простой сервер, все в порядке, интерфейс администратора прекрасен:

python manage.py runserver

Однако, когда я пытаюсь обслуживать свое приложение, используя wsgi-сервер с django.core.handlers.wsgi.WSGIHandler, Django, кажется, забывает, где находятся административные медиа-файлы, а страница администратора совсем не стилизуется:

gunicorn_django

Как это случилось?

Ответы [ 3 ]

2 голосов
/ 13 июня 2010

Когда я просматриваю исходный код Django, я выясняю причину.

Где-то в модуле django.core.management.commands.runserver объект WSGIHandler завернутый в AdminMediaHandler.

Согласно документу, AdminMediaHandler является

Промежуточное программное обеспечение WSGI, которое перехватывает вызовы в каталог СМИ администратора, как определяется настройкой ADMIN_MEDIA_PREFIX и обслуживает эти изображения. Используйте это ТОЛЬКО МЕСТНО, для развития! Это не было проверено за безопасность и не супер эффективно.

И именно поэтому административные медиа-файлы можно найти только автоматически, когда я использовал тестовый сервер.

Теперь я просто продолжаю и вручную устанавливаю отображение URL-адреса для администратора:)

1 голос
/ 13 июня 2010

Django по умолчанию не обслуживает медиафайлы, так как обычно эти статические файлы лучше обслуживать на другом сервере (для производительности и т. Д.). Таким образом, при развертывании приложения необходимо убедиться, что вы настроили другой сервер (или виртуальный сервер), который обслуживает носитель (включая носитель администратора). Вы можете найти средства администрирования в django/contrib/admin/media. Вы должны настроить свои MEDIA_URL и ADMIN_MEDIA_URL так, чтобы они указывали на медиа-файлы. Смотри также http://docs.djangoproject.com/en/dev/howto/static-files/#howto-static-files.

0 голосов
/ 12 сентября 2011

Я тоже столкнулся с этой проблемой (потому что я занимаюсь разработкой против gunicorn), и вот как убрать магию admin-media и обслуживать административные медиа как любые другие медиа через urls.py:

import os

import django

...

admin_media_url = settings.ADMIN_MEDIA_PREFIX.lstrip('/') + '(?P<path>.*)$'
admin_media_path = os.path.join(django.__path__[0], 'contrib', 'admin', 'media')

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^' + admin_media_url , 'django.views.static.serve', {
        'document_root': admin_media_path,
    }, name='admin-media'),
    ...
)

Также: http://djangosnippets.org/snippets/2547/

И, конечно же, #include <production_disclaimer.h>.

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