【问题标题】:Django admin media stopped being served locallyDjango 管理媒体停止在本地提供服务
【发布时间】:2011-12-09 17:48:40
【问题描述】:

我建立了一个简单的项目,并且在一定程度上一切正常。我正在向项目中添加东西,静态目录的路径等,然后突然我意识到管理媒体停止提供服务,没有 css,没有图像。

查看页面的源代码会发现:

link rel="stylesheet" type="text/css" href="/static/admin/css/base.css"

这是正确的,并且相同的路径适用于任何新创建的 Django 项目。

基本上,我想以某种方式重新启用从默认位置提供管理媒体的功能。

这是 settings.py,但坦率地说,从它停止工作的那一刻起,我并没有对其进行太多更改。

# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = os.path.join(PROJECT_ROOT, "site_media", "media")

# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = "/site_media/media/"

# Absolute path to the directory that holds static files like app media.
# Example: "/home/media/media.lawrence.com/apps/"
STATIC_ROOT = os.path.join(PROJECT_ROOT, "site_media", "static1")

# URL that handles the static files like app media.
# Example: "http://media.lawrence.com"
STATIC_URL = "/site_media/"

# Additional directories which hold static files
STATICFILES_DIRS = [
    os.path.join(PROJECT_ROOT, "site_media"),
    os.path.join(PROJECT_ROOT, "site_media", "static"),
    os.path.join(PROJECT_ROOT, "site_media", "media"),
]

# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/static/admin/'

# Make this unique, and don't share it with anybody.
SECRET_KEY = '__@9nw29=7gbj8xb5z*u6cew3x8m(&_v&jlp16!^bnpe+6@w0#'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

ROOT_URLCONF = 'wizs.urls'

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    os.path.join(PROJECT_ROOT, "templates"),
)


TEMPLATE_CONTEXT_PROCESSORS = [
    "django.core.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.request",
    "django.contrib.messages.context_processors.messages",
    'django.core.context_processors.static',
]

更新

似乎归结为要兼顾这两个属性:

1) 现在我看到的是管理媒体,但不是媒体(例如上传的图片)

STATIC_URL = "/site_media/static/"
ADMIN_MEDIA_PREFIX = '/site_media/static/admin/'

2) 现在我看到上传的媒体文件,但不是管理媒体

STATIC_URL = "/site_media/"
ADMIN_MEDIA_PREFIX = '/site_media/static/admin/'

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    看起来 STATIC_URL 应该是“/site_media/static1/”,ADMIN_MEDIA_PREFIX 应该是“/site_media/static1/admin/”

    其他一些建议:

    1. 不要将你的 MEDIA_ROOT 编译成你的 STATIC_ROOT,所以删除os.path.join(PROJECT_ROOT, "site_media", "media"),
    2. 您的本地静态文件也不应该在 site_media 中。所以删除 os.path.join(PROJECT_ROOT, "site_media", "static"), 并将其更改为 os.path.join(PROJECT_ROOT, "static"), 并将该目录移动到那里。
    3. 你应该在本地清除site_media,只在服务器上填充。 (或者,当然还有您在本地上传的任何媒体)。但是您根本不需要在本地运行 collectstatic。
    4. 如果/一旦你做了这些事情,你可以将“static1”改回静态,然后通过 nginx 提供整个 /site_media/ 文件夹,然后你不会在那个文件夹中有任何重复。

    祝你好运。

    这是我的设置:

    # settings.py
    MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'site_media', 'media')
    MEDIA_URL = '/site_media/media/'
    
    STATIC_ROOT = os.path.join(PROJECT_ROOT, 'site_media', 'static')
    STATIC_URL = '/site_media/static/'
    
    ADMIN_MEDIA_PREFIX = '/site_media/static/admin/'
    
    STATICFILES_DIRS = (
        os.path.join(PROJECT_ROOT, 'static'),
    )
    
    STATICFILES_FINDERS = (
        'django.contrib.staticfiles.finders.FileSystemFinder',
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    )
    
    # urls.py
    from django.conf import settings
    
    urlpatterns += patterns('',
        url(r'^site_media/static/(?P<path>.*)$', 'django.contrib.staticfiles.views.serve'),
        url(r'^site_media/media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        })
    )
    

    【讨论】:

    • 请查看帖子末尾的更新。 O 设法使管理媒体出现,但随后我上传的文件消失了。好像我找不到两者都有的设置。
    • 我添加了所有设置,请检查它们是否适合您。
    • urls.py 成功了。但是,我需要像以前一样拥有 STATICFILES_DIRS,而不是你拥有它的方式。静态文件、媒体和管理媒体的整个事情在 Django 中非常令人困惑。我希望他们尽快简化。
    猜你喜欢
    • 2011-01-22
    • 2011-02-10
    • 2022-01-04
    • 2017-05-18
    • 1970-01-01
    • 2019-12-01
    • 2021-09-24
    • 2010-12-30
    • 2010-12-21
    相关资源
    最近更新 更多