访问Django中的"媒体"文件

Ric*_*ard 56 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, }),
    )
Run Code Online (Sandbox Code Playgroud)

但我获得媒体文件的唯一方法是参考/media/media/例如 <img src="/media/media/image.png" />.

我期待(并希望)
<img src="/media/image.png" />

谁能告诉我这里发生了什么,并给我一个简单的方法来设置媒体文件处理?

非常感谢你.


@Timmy O'Mahony - 谢谢!史诗般的帖子,非常清楚.但它留下了几个问题:

(1)我必须用/media//static/,不media/static/MEDIA_URL和与STATIC_URL-我这么想吗?

(2)如果collectstatic软管/static/,你在哪里放置网站级CSS,例如网站的CSS文件?/static/显然不在.

(3)我将它们放在项目根目录下的"_"目录中并设置STATICFILES_DIRS为指向它 - 这似乎是开发服务器获取其静态文件的地方,尽管有urlpatterns指令.如果这是错误的,你在开发过程中将网站级CSS放在哪里,以及collectstatic修改它们时的工作流程是什么- 你是否必须在一个地方编辑它们,并在每次编辑后将它们收集到其他地方?

Tim*_*ony 166

文件夹设置:

您的项目根应该是这样的:

/app1
/app2
/media
/static
/templates
urls.py
settings.py
manage.py
Run Code Online (Sandbox Code Playgroud)

媒体文件夹应该装东西,例如图片,下载和其他材料可能正常使用本网站的过程中被上传(即开发完成后)

静态文件夹应该容纳所有的CSS/JS等材料是网站发展的一个组成部分


Settings.py:

MEDIA_ROOT是上面提到的静态文件夹的绝对服务器路径.这意味着它应该是这样的:

MEDIA_ROOT = "/User/Bob/Sites/MySite/Project_root/media/"
Run Code Online (Sandbox Code Playgroud)

MEDIA_URL是您在查看网站时应访问媒体文件的相对浏览器URL.应该(通常)

MEDIA_URL = "media/"
Run Code Online (Sandbox Code Playgroud)

这意味着可以在http://example.com/media/查看所有资料

同样,STATIC_ROOT应该是这样的

STATIC_ROOT = "/User/Bob/Sites/MySite/Project_root/static/"
Run Code Online (Sandbox Code Playgroud)

STATIC_URL

STATIC_URL = "static/" 
Run Code Online (Sandbox Code Playgroud)

提供文件:

既然您已告诉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,
        }),
)
Run Code Online (Sandbox Code Playgroud)

额外:

如果您有多个应用程序,每个应用程序都有自己的CSS和JS文件,您可能不希望将它们放入一个/ static /文件夹中.将它们放在它们所属的应用程序的子文件夹中可能很有用:

/app1/static/ # Specific static folder
/app2/static/
/media/
/static/ # Root static folder
Run Code Online (Sandbox Code Playgroud)

现在,您的Web服务器/开发服务器只查找您告诉它的静态文件(即根静态文件夹),因此您需要收集子文件夹中的所有文件并将它们复制到根静态文件夹.您可以手动执行此操作,但是django提供了一个命令来为您执行此操作(这是静态应用程序的重点)

./manage collectstatic
Run Code Online (Sandbox Code Playgroud)

  • [我已整理了这个答案并将其转变为博客文章](http://timmyomahony.com/blog/static-vs-media-and-root-vs-path-in-django/) (7认同)
  • 谢谢你,我完全忘记了开发服务的"静态服务",想知道为什么我的文件没有送达.如果可以的话,我会更多地推荐你的帖子;) (3认同)

Dan*_*man 27

为什么要将MEDIA_ROOT设置设为空白?它必须是您的媒体目录的路径.因为,正如你所说,你的媒体在一个名为的子目录中media,你应该把它放进去MEDIA_ROOT.

  • 我更喜欢使用绝对路径来避免问题.我在settings.py中使用了一个小包装:`import os.path``ABSOLUTE_PATH = lambda x:os.path.join(os.path.abspath(os.path.dirname(__ file __)),x)` `MEDIA_ROOT = ABSOLUTE_PATH('media /')` (6认同)

Anu*_*nuj 15

我跟着timmy程序但是我得到了一个没有模块名称的错误django.views.当我import django.views在virtualenv中使用时,一切正常,即导入库不是问题.

但是,我能够通过在我的主urls文件中执行此过程来解决此问题

from django.conf.urls.static import  static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)

https://docs.djangoproject.com/en/dev/howto/static-files/


Maj*_*ati 7

我有同样的问题所以我添加了这些行

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'', include('blog.urls')),
    url(r'^admin/', admin.site.urls),
    url(r'^cadmin/', include('cadmin.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)

urls.pyDjango项目配置目录中.更多信息:https://overiq.com/django/1.10/handling-media-files-in-django/