繁体   English   中英

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

[英]Why can't Django find my admin media files once I leave the built-in runserver?

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

python manage.py runserver

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

gunicorn_django

这怎么发生的?

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

django.core.management.commands.runserver模块的某处, WSGIHandler对象被包装在AdminMediaHandler

根据该文件, AdminMediaHandler是一个

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

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

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

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

我也遇到了这个问题(因为我对枪炮进行了一些开发),这里是如何删除管理媒体魔术并通过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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM