Django无法找到我的媒体文件(在开发服务器上)
现在我的媒体文件在本地开发机器上。
我的 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 个回答
在开发服务器上,这个页面可能会对你有帮助。 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'}),
)
适用于 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)
请注意,Django 的文档中提到,这种方法
不适合用于生产环境
(显然,除非你使用 if settings.DEBUG:
这一部分)
你现在在使用Django的时候,把之前和之后的静态文件处理搞混了。最开始,所有的静态文件都是从MEDIA_URL
这个地方提供的,但Django 1.3引入了一个新的静态文件处理包,叫做staticfiles,同时也增加了STATIC_ROOT
和STATIC_URL
这两个设置。django.views.static.serve
这个功能是利用了新的staticfiles应用,但你还没有设置好它。
假设你在使用Django 1.3,首先,你需要在INSTALLED_APPS
里添加'staticfiles'。接着,你还需要定义STATIC_ROOT
和STATIC_URL
。通常情况下,标准的位置是项目根目录下的一个叫"static"的文件夹。
你还需要添加一个静态文件模板上下文处理器:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.core.context_processors.static',
)
这样一来,STATIC_URL
这个变量就可以在你的模板中使用了,你可以用类似{{ STATIC_URL }}css/style.css
的方式来引用你的资源。
所有的静态资源也需要放在一个叫"static"的应用级目录里。实际上,项目根目录下的"static"文件夹是不会直接使用的。它只是一个地方,用来存放collectstatic
管理命令收集的所有静态资源,以便在生产环境中使用。
如果你想要一些全项目通用的静态资源(不绑定到某个特定的应用),你需要一个完全独立的目录(也就是说,不能和MEDIA_ROOT
或STATIC_ROOT
是同一个)。我通常会用一个叫"assets"的目录。然后你还需要告诉Django去这个地方找静态资源,使用STATICFILES_DIRS
这个设置:
STATICFILES_DIRS = (
os.path.join(os.path.dirname(__file__), 'assets'), # or whatever you named it
)
MEDIA_ROOT
和MEDIA_URL
现在只用于用户上传的文件(比如通过FileField
和ImageField
创建的任何文件),所以你还是需要它,但你不会手动在这里存放任何东西。
当你进入生产环境时,你的网页服务器需要在MEDIA_URL
和STATIC_URL
分别提供MEDIA_ROOT
和STATIC_ROOT
的内容。你还需要运行:
$ python manage.py collectstatic
这样Django就会把所有的静态文件编译到STATIC_ROOT
指定的目录里。