在Django中访问“媒体”文件
我想要喜欢Django,但是在开发环境中这种静态和媒体文件的业务正在让我疯狂。 请把我从我的愚蠢中解救出来。
我在我的开发机器上。 我有我的项目目录的根目录中的文件夹media
。
在settings.py
我有: MEDIA_ROOT = ''
和MEDIA_URL = '/media/'
。
在urls.py
我有:
if settings.DEBUG: urlpatterns += patterns('', url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT, }), )
但是我可以通过引用/media/media/
例如<img src="/media/media/image.png" />
来获取媒体文件。
我期望(并希望)
<img src="/media/image.png" />
任何人都可以告诉我这里发生了什么,给我一个简单的configuration,设置媒体文件处理?
非常感谢你。
@Timmy O'Mahony – 谢谢! 史诗般的post,非常清楚。 但是这留下了一些问题:
(1)我必须使用/media/
和/static/
,而不是media/
和static/
作为MEDIA_URL
和STATIC_URL
– 我错过了什么?
(2)如果是/static/
软pipe/static/
,你在哪里把网站级别的CSS,如网站的CSS文件? 不在/static/
,显然。
(3)我将它们放在项目根目录下的“_”目录下,并将STATICFILES_DIRS
设置为指向它 – 这似乎是开发服务器获取其静态文件的位置,尽pipe使用了urlpatterns
指令。 如果这是错误的,那么你在开发过程中把CSS放在什么位置?当你修改它时,你需要将它们编辑到一个地方,并在每次编辑之后把它们收集到别的地方。
你为什么把MEDIA_ROOT
设置为空? 它需要成为您的媒体目录的path。 因为,正如你所说,你的媒体是在一个名为media
的子目录,你应该把它放在MEDIA_ROOT
。
文件夹设置:
你的项目根目录应该是这样的:
/app1 /app2 /media /static /templates urls.py settings.py manage.py
媒体文件夹应该保存在正常使用网站期间可能上传的图像,下载和其他材料(即开发完成后)
静态文件夹应该保存所有的CSS / JS和其他材料,这是网站开发的一部分
Settings.py:
MEDIA_ROOT是上面提到的静态文件夹的绝对服务器path。 这意味着它应该是这样的:
MEDIA_ROOT = "/User/Bob/Sites/MySite/Project_root/media/"
MEDIA_URL是您在查看网站时应该访问媒体文件的相对浏览器url。 它应该(通常)
MEDIA_URL = "media/"
这意味着所有资料可以在http://example.com/media/上查看;
同样, STATIC_ROOT应该是类似的
STATIC_ROOT = "/User/Bob/Sites/MySite/Project_root/static/"
和STATIC_URL是
STATIC_URL = "static/"
提供文件:
现在你已经告诉Django这些文件夹应该在哪里,以及正确的URL来访问它们,你需要正确地提供所有的请求到文件夹。
通常当你在制作时,你需要web服务器来照顾你的静态文件和媒体文件。
如果你正在开发,你可以让django开发服务器为你服务。
为此,请告诉它将进入http://example.com/media的所有请求路由到您的MEDIA_ROOT,并将所有进入http://example.com/static的请求路由到您的STATIC_ROOT。;
要做到这一点,你需要像URLS.py一样添加一些URL:
from django.conf import settings if settings.DEBUG: urlpatterns += patterns('', url(r'^media/(?P<path>.*)$', 'django.views.static.serve', { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P<path>.*)$', 'django.views.static.serve', { 'document_root': settings.STATIC_ROOT, }), )
额外 :
如果你有多个应用程序,每个应用程序都有自己的CSS和JS文件,你可能不想把它们扔到一个单一的/静态/文件夹。 将它们放在它们所属的应用程序的子文件夹中可能是有用的:
/app1/static/ # Specific static folder /app2/static/ /media/ /static/ # Root static folder
现在,你的web服务器/开发服务器只是寻找静态文件,你告诉它看起来(即根静态文件夹),所以你需要收集子文件夹中的所有文件,并将其复制到根静态文件夹。 你可以手工做到这一点,但Django提供了一个命令为你做这个(这是静态应用程序的整个点)
./manage collectstatic
我遵循timmy程序,但我得到一个错误,没有模块名称django.views
。 当我在我的virtualenv中使用import django.views
,一切正常,这不是导入库的问题。
但是,我能够通过在我的主要URL文件中遵循这个过程来解决这个问题
from django.conf.urls.static import static urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
在你的settings.py中 ,确保你添加了
django.core.context_processors.media
在您的TEMPLATE_CONTEXT_PROCESSORS.Otherwise MEDIA_ROOT将不起作用,当您在模板中使用它。
我正在使用Django 1.10。 而我的媒体文件夹是“上传”这是我settings.py中的configuration:
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads') MEDIA_URL = '/uploads/'
而在模板中,我将MEDIA_URL的名称放在de object.name之前,而不是object.url,如下所示:
<img src="uploads/{{ imagen_identificativa.name }} " alt="{{imagen_identificativa}}">
它适用于我。 我希望这有帮助。