Django 找不到我的媒体文件(在开发服务器上)
Posted
技术标签:
【中文标题】Django 找不到我的媒体文件(在开发服务器上)【英文标题】:Django cannot find my media files (on development server) 【发布时间】:2012-02-28 09:42:42 【问题描述】:媒体目前在我的本地开发机器上。
我的 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/'
没有“管理员”文件夹,但我认为这不会有什么不同。 在 urls.py 文件中我有:
(r'^media/(?P<path>.*)$', 'django.views.static.serve', 'document_root': settings.MEDIA_ROOT),
我不知道该怎么做才能让它工作。 [我正在尝试学习 django,并且正在处理一个非常复杂的现有项目]
【问题讨论】:
【参考方案1】:您正在混合和匹配 Django 1.3 前后的静态文件处理。最初所有的静态文件都是从 MEDIA_URL
提供的,但是 Django 1.3 引入了 staticfiles contrib 包和相关的 STATIC_ROOT
和 STATIC_URL
设置。 django.views.static.serve
使用了您尚未设置的新静态文件应用程序。
假设您正在运行 Django 1.3,首先,您需要将“静态文件”添加到您的 INSTALLED_APPS
。然后,您需要定义STATIC_ROOT
和STATIC_URL
。标准位置是一个名为“static”的项目根目录。
您还需要添加 staticfiles 模板上下文处理器:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.core.context_processors.static',
)
这将使STATIC_URL
变量在您的模板中可用,因此您可以使用 STATIC_URL css/style.css
之类的内容引用您的资源
您的所有静态资源还需要进入名为“static”的应用级目录。实际的项目根级“静态”目录从不直接使用。这只是collectstatic
管理命令转储所有静态资源以用于生产的地方。
如果您想要项目范围内的静态资源(不绑定到任何特定应用程序),您将需要一个完全独立的目录(即与 MEDIA_ROOT
不同或 STATIC_ROOT
) .我倾向于使用一个名为“资产”的东西。然后,您需要告诉 Django 在此处查找静态资源以及 STATICFILES_DIRS
设置:
STATICFILES_DIRS = (
os.path.join(os.path.dirname(__file__), 'assets'), # or whatever you named it
)
MEDIA_ROOT
/MEDIA_URL
现在仅用于用户上传(例如,通过FileField
s 和ImageField
s 创建的任何文件,因此您仍然需要它,但您永远不会手动存储任何内容。
当您进入生产阶段时,您的网络服务器将需要分别在MEDIA_URL
和STATIC_URL
为MEDIA_ROOT
和STATIC_ROOT
提供服务。您还需要运行:
$ python manage.py collectstatic
让Django将你所有的静态文件编译到STATIC_ROOT
指定的目录中。
【讨论】:
哎呀,应该记得当代码来自 1.2 时我在 1.3 中工作,有没有办法让我不必在 1.2 代码中更改太多就能够在没有问题?或者我降级到 django 1.2 会更好吗? 还有一些其他设置,例如DATABASES
,可能会给您弃用警告,或者可能需要进行修改以与 Django 1.3 兼容,但总体而言强制性更改相对较少。就个人而言,我建议坚持使用 1.3 并使应用程序正常工作。使其工作可能涉及的轻微工作远远超过静态文件、基于类的视图、改进的模板标签等的好处。另外,它将使最终跳转到 1.4 变得更容易,这几乎是必须的从我所看到的中解脱出来。【参考方案2】:
适用于 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:
部分)
【讨论】:
这里记录了 docs.djangoproject.com/en/1.10/howto/static-files/…,至少从 1.10 开始,您不需要if settings.DEBUG:
位。您仍然需要根据您是否处于调试模式,有条件地配置 MEDIA_URL
和 MEDIA_ROOT
。【参考方案3】:
在开发服务器上,此页面可能会对您有所帮助。 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'),
)
【讨论】:
【参考方案4】:我使用 python-django 1.7
if settings.DEBUG:
urlpatterns = patterns('',
(r'^$', 'blenderx3d.first_step.views.index'),
(r'^media/(?P<path>.*)$','django.contrib.staticfiles.views.serve'),)
【讨论】:
以上是关于Django 找不到我的媒体文件(在开发服务器上)的主要内容,如果未能解决你的问题,请参考以下文章