【问题标题】:Django: serving ADMIN media filesDjango:提供 ADMIN 媒体文件
【发布时间】:2010-11-08 01:42:27
【问题描述】:

我已经成功地为普通的 MEDIA 文件提供媒体文件,但是当我尝试提供管理媒体文件时,我失败了。请帮我找出问题所在,因为我已经尝试解决问题几个小时但没有运气(也一直在谷歌搜索并阅读了关于提供静态文件的 django 文档)。

我尝试访问 localhost:8000/media/a.gif 的错误如下:

找不到页面: f:\python25\lib\site-packages\django/contrib/admin/media\a.gif

我将管理媒体文件放在名为“media”的目录中,而将普通媒体文件放在名为“static”的目录中。我也在 Windows 上。

这是我在 urls.py 中提供普通媒体文件的方式:

# serve static files
from django.conf import settings
if settings.ENVIRONMENT==settings.ENV_DEVELOPMENT:
    urlpatterns += patterns("django.views",
        url(r"%s(?P<path>.*)$" % settings.MEDIA_URL[1:], "static.serve", {"document_root": settings.MEDIA_ROOT,})
    )

还有我的 settings.py(仅重要部分):

import project_path
MEDIA_ROOT = project_path.MEDIA.replace('\\','/')
MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/media/'
TEMPLATE_DIRS = (
    project_path.TEMPLATE.replace('\\','/'),
)

还有我的 project_path.py:

import sys
from os.path import dirname, join
ROOT = dirname(__file__)
APP = join(ROOT, "apps")
TEMPLATE = join(ROOT, "templates")
MEDIA = join(ROOT, "static")
ADMIN_MEDIA = join(ROOT, "media")

有什么提示吗?

或者至少请分享您如何提供您的管理媒体文件(不更改来自网络服务器的任何文件,但只能通过 django 源代码)

提前致谢:)

【问题讨论】:

  • 你解决过这个问题吗?我在使用 Django 1.1 的 Mac 上工作时也有类似的经历,提供正常的媒体文件工作但不适用于管理员......
  • url 设置不起作用的原因是django/core/management/commands/runserver.py 和django.core.servers.basehttp 为ADMIN_MEDIA_PREFIX 设置了一个WSGI 处理程序。它在 URLconf 被命中之前处理请求

标签: django routing path media admin


【解决方案1】:

您的答案是,除非ADMIN_MEDIA_PREFIX 明确设置域 runserver 命令将从 contrib.admin 中提供管理媒体文件。

我也被这种魔法 行为烧伤了。有一张票 (Ticket #8336),但设计决定是保留原有的便利和混乱。

因此,要使用 runserver 命令从您的目录中提供您的管理媒体(用于使用 grappelli 或任何您想使用的管理皮肤),您必须使用类似的东西:

MEDIA_ROOT =  os.path.join(PROJECT_ROOT, 'media/')
ADMIN_MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'admin-media/')
MEDIA_URL = '/site-media/'
ADMIN_MEDIA_PREFIX = 'http:/localhost:8000/admin-media/'

我希望我在这里复活了正确的问题。提前道歉。

【讨论】:

  • 神奇的便利行为。谢谢姜戈!在 settings.py 中设置合理的默认值怎么样? (叹气)...感谢这个 Phoku!
  • 我认为他们的决定有一些逻辑,因为也许大多数用户不会改变,而且已经有很多设置需要处理。作为初学者,拥有这种便利是很不错的。
  • “魔法”更像是一种巧妙的解决方法,它取消了path.startswith(base_url) 签入AdminMediaHandler._should_handle()。因此,您跳过 WSGI 处理程序,并输入正常的 URLconf :)
【解决方案2】:

建议运行开发服务器有点不同 [1] python manage.py runserver mydomain.com:8000 --adminmedia=/path/to/your/admin/media/

[1]http://code.google.com/p/django-grappelli/wiki/Installation

【讨论】:

  • 那必须是 django-grappelli 特定的。使用香草 Django 1.2,我得到 error: no such option: --adminmedia
  • 不,解释是 [这里][1]:“如果启用了静态文件 contrib 应用程序(新项目中的默认设置),runserver 命令将被自己的 runserver 命令覆盖,该命令没有由于弃用的 --adminmedia 选项。" [1]:docs.djangoproject.com/en/dev/ref/django-admin
【解决方案3】:

试试

(r'^admin_media/(.*)', 'django.views.static.serve', {'document_root' : 'django/contrib/admin/media/', 'show_indexes' : True}),

在您的 urls.py 文件中。并改变你的

ADMIN_MEDIA_PREFIX = '/admin_media/'

【讨论】:

  • 感谢您的回答,但它仍然不起作用:) 我在浏览器 url 中输入了localhost:8000/admin_media/a.gif,结果是:找不到页面:f:\python25\lib\site-packages \django/contrib/admin/media\a.gif
【解决方案4】:

我刚刚在我的测试站点中修复了一个类似的错误。 ADMIN_MEDIA_PREFIX 和 MEDIA_URL 永远不能相同,请参阅docs 中的以下注释:

确保使用尾部斜杠,并且 有这个不同于 MEDIA_URL 设置(因为相同的 URL 不能映射到两个不同的 文件集)。

【讨论】:

    【解决方案5】:

    尝试改变:

    ADMIN_MEDIA_PREFIX = '/static/media/'

    这假设您的 MEDIA_ROOT/media/ 目录包含管理媒体文件夹(这是我从您的问题中理解的)。

    【讨论】:

    • 感谢您的回答,但它仍然不起作用:) 我在浏览器 url 中输入了localhost:8000/static/media/a.gif,结果是:找不到页面:f:\python25\lib\site-packages \django/contrib/admin/media\a.gif
    • 我想我会尝试使用传统的管理媒体示例从头开始重新创建项目 :) 感谢您的回答
    【解决方案6】:

    由于静态文件包含在主干中(我相信大约是 1.3),因此不再使用 ADMIN_MEDIA_PREFIX 魔法。

    现在,runserver 假定您的 STATIC_URL + 'admin/'。它偷偷地、默默地拦截你的请求,忽略你所有的urlconf,并试图让你发疯。

    【讨论】:

    • 我发现相反的情况 - 如果我没有 ADMIN_MEDIA_PREFIX = posixpath.join(STATIC_URL, "admin/") (即,如果我根本没有设置 ADMIN_MEDIA_PREFIX),则使用 django 1.3然后 runserver 没有正确地为我的管理媒体提供服务。
    【解决方案7】:

    尝试使用 STATICFILES_DIRS 作为打击

    # Additional locations of static files
    STATICFILES_DIRS = (
        # Put strings here, like "/home/html/static" or "C:/www/django/static".
        # Always use forward slashes, even on Windows.
        # Don't forget to use absolute paths, not relative paths.
        ("images", os.path.join(STATIC_ROOT,'images').replace('\\','/')),
        ("css",    os.path.join(STATIC_ROOT,'css').replace('\\','/')),
        ("js",     os.path.join(STATIC_ROOT,'js').replace('\\','/')),
    )
    

    祝你好运!

    【讨论】:

    • STATICFILES_DIRS = ( ("media", os.path.join(STATIC_ROOT,'media').replace('\\','/')), )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多