离开内置的runserver后,为什么Django找不到我的管理媒体文件?

时间:2010-06-13 14:18:05

标签: python django django-admin

当我使用内置的简单服务器时,一切正常,管理界面很漂亮:

python manage.py runserver

但是,当我尝试使用带有django.core.handlers.wsgi.WSGIHandler的wsgi服务器来提供我的应用程序时,Django似乎忘记了管理媒体文件的位置,并且管理页面根本没有样式:

gunicorn_django

这是怎么发生的?

3 个答案:

答案 0 :(得分:2)

当我查看Django的源代码时,我找出原因。

django.core.management.commands.runserver模块中的某个位置,WSGIHandler对象是。{ 包裹在AdminMediaHandler内。

根据该文件,AdminMediaHandler

  

拦截调用的WSGI中间件   到管理媒体目录,如       由ADMIN_MEDIA_PREFIX设置定义,并为这些图像提供服务。       仅限本地使用,用于开发!这尚未经过测试   对于       安全性并不是超级高效。

这就是为什么管理媒体文件只能在我使用测试服务器时自动找到。

现在我继续手动设置管理媒体网址映射:)

答案 1 :(得分:1)

默认情况下,Django不提供媒体文件,因为通常最好在另一台服务器上提供这些静态文件(性能等)。因此,在部署应用程序时,您必须确保设置另一个服务于媒体的服务器(或虚拟服务器)(包括管理媒体)。您可以在django/contrib/admin/media中找到管理媒体。您应该设置MEDIA_URL和ADMIN_MEDIA_URL,以便它们指向媒体文件。另请参阅http://docs.djangoproject.com/en/dev/howto/static-files/#howto-static-files

答案 2 :(得分:0)

我也遇到过这个问题(因为我针对gunicorn进行了一些开发),这里是如何通过urls.py删除admin-media魔术并像其他任何媒体一样提供管理媒体:

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>