Django无法找到我的媒体文件(在开发服务器上)

7 投票
4 回答
10979 浏览
提问于 2025-04-17 12:27

现在我的媒体文件在本地开发机器上。

我的 MEDIA_ROOT、MEDIA_URL 和 ADMIN_MEDIA_PREFIX 设置如下:

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), "media")
MEDIA_URL = '/media/'
SITE_URL = 'http://localhost:80'
ADMIN_MEDIA_PREFIX = '/media/admin/'

虽然没有 'admin' 文件夹,但我觉得这应该没什么影响。 在 urls.py 文件中,我有:

(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),

我不知道该怎么做才能让它正常工作。 [我正在学习 Django,并且在处理一个相当复杂的现有项目]

4 个回答

4

在开发服务器上,这个页面可能会对你有帮助。 https://docs.djangoproject.com/en/1.2/howto/static-files/

你可以在urls.py文件中添加以下代码:

if settings.DEBUG:
    urlpatterns += patterns('', 
        (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/path/to/media'}),
    )
8

适用于 Django 1.8 到 1.11 版本:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

https://docs.djangoproject.com/en/1.11/howto/static-files/#serving-files-uploaded-by-a-user-during-development

请注意,Django 的文档中提到,这种方法

不适合用于生产环境

(显然,除非你使用 if settings.DEBUG: 这一部分

7

你现在在使用Django的时候,把之前和之后的静态文件处理搞混了。最开始,所有的静态文件都是从MEDIA_URL这个地方提供的,但Django 1.3引入了一个新的静态文件处理包,叫做staticfiles,同时也增加了STATIC_ROOTSTATIC_URL这两个设置。django.views.static.serve这个功能是利用了新的staticfiles应用,但你还没有设置好它。

假设你在使用Django 1.3,首先,你需要在INSTALLED_APPS里添加'staticfiles'。接着,你还需要定义STATIC_ROOTSTATIC_URL。通常情况下,标准的位置是项目根目录下的一个叫"static"的文件夹。

你还需要添加一个静态文件模板上下文处理器:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'django.core.context_processors.static',
)

这样一来,STATIC_URL这个变量就可以在你的模板中使用了,你可以用类似{{ STATIC_URL }}css/style.css的方式来引用你的资源。

所有的静态资源也需要放在一个叫"static"的应用级目录里。实际上,项目根目录下的"static"文件夹是不会直接使用的。它只是一个地方,用来存放collectstatic管理命令收集的所有静态资源,以便在生产环境中使用。

如果你想要一些全项目通用的静态资源(不绑定到某个特定的应用),你需要一个完全独立的目录(也就是说,不能和MEDIA_ROOTSTATIC_ROOT是同一个)。我通常会用一个叫"assets"的目录。然后你还需要告诉Django去这个地方找静态资源,使用STATICFILES_DIRS这个设置:

STATICFILES_DIRS = (
    os.path.join(os.path.dirname(__file__), 'assets'), # or whatever you named it
)

MEDIA_ROOTMEDIA_URL现在只用于用户上传的文件(比如通过FileFieldImageField创建的任何文件),所以你还是需要它,但你不会手动在这里存放任何东西。

当你进入生产环境时,你的网页服务器需要在MEDIA_URLSTATIC_URL分别提供MEDIA_ROOTSTATIC_ROOT的内容。你还需要运行:

$ python manage.py collectstatic

这样Django就会把所有的静态文件编译到STATIC_ROOT指定的目录里。

撰写回答