当我使用内置的简单服务器时,一切正常,管理界面很漂亮:
python manage.py runserver
但是,当我尝试使用带有django.core.handlers.wsgi.WSGIHandler
的wsgi服务器来提供我的应用程序时,Django似乎忘记了管理媒体文件的位置,并且管理页面根本没有样式:
gunicorn_django
这是怎么发生的?
答案 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>
。