【问题标题】:Django MEDIA_URL and MEDIA_ROOTDjango MEDIA_URL 和 MEDIA_ROOT
【发布时间】:2011-07-27 22:32:33
【问题描述】:

我正在尝试通过 Django 管理员上传图像,然后在前端的页面中或仅通过 URL 来查看该图像。

请注意,这一切都在我的本地机器上。

我的设置如下:

MEDIA_ROOT = '/home/dan/mysite/media/'

MEDIA_URL = '/media/'

我已将upload_to参数设置为'images',文件已正确上传到目录:

'/home/dan/mysite/media/images/myimage.png'

但是,当我尝试通过以下 URL 访问图像时:

http://127.0.0.1:8000/media/images/myimage.png

我收到 404 错误。

我需要为上传的媒体设置特定的 URLconf 模式吗?

任何建议表示赞赏。

谢谢。

【问题讨论】:

    标签: django media


    【解决方案1】:

    更新 Django >= 1.7

    根据 Django 2.1 文档:Serving files uploaded by a user during development

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = patterns('',
        # ... the rest of your URLconf goes here ...
    ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    您不再需要if settings.DEBUG,因为 Django 将确保它仅在调试模式下使用。


    Django 的原始答案

    试着把它放到你的 urls.py

    from django.conf import settings
    
    # ... your normal urlpatterns here
    
    if settings.DEBUG:
        # static files (images, css, javascript, etc.)
        urlpatterns += patterns('',
            (r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT}))
    

    有了这个,你可以在DEBUG = True(当你在本地计算机上运行时)提供来自 Django 的静态媒体,但是你可以让你的 web 服务器配置在你投入生产和DEBUG = False时提供静态媒体

    【讨论】:

    • 附言。然后,您可以在模板中使用它:
    • 我认为在media//(?P&lt;path&gt;.*)$ 之前添加^ 符号并不好,有时当我们在应用程序url 路径中访问媒体文件时(如http://127.0.0.1:8000/myapp/media/img/logo.png),这个正则不会算术。
    • 我已经挣扎了 2 天了,为什么我的图像返回 404。这是我唯一缺少的东西,我在 Django 文档中找不到它。谢谢。
    • 如果你使用的是 Django 1.5+,请看下面的答案;这是一个更好的解决方案。
    • 这是在您的应用或项目 urls.py 中吗?
    【解决方案2】:

    请仔细阅读官方Django DOC,你会找到最合适的答案。

    解决这个问题的最好和最简单的方法如下。

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = patterns('',
        # ... the rest of your URLconf goes here ...
    ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    【讨论】:

    • 是django 1.5新增的功能
    • 在生产环境中使用 apache 可以这样使用吗?
    • @andi - 不,在生产中以这种方式使用它是不行的。它应该在您的生产环境中通过 apache 进行配置。
    • 但是可以将这段代码留在生产环境中,不检查if settings.DEV,因为它会自动禁用?
    【解决方案3】:

    对于 Django 1.9,您需要根据文档添加以下代码:

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        # ... the rest of your URLconf goes here ...
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    

    更多信息,你可以参考这里:https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development

    【讨论】:

    • 这是 django >1.9 的解决方案,谢谢。
    • 请确保将其放入您的 项目 的 urls.py 中,而不是您的应用程序中,这是我不小心做的。
    • 在 1.10 上也为我工作过。
    • 对我不起作用。或许 settings.py 中有任何必要的底层设置?
    【解决方案4】:

    这里我在 Django 2.0 中做了什么。首先在setting.py中设置MEDIA_ROOT一个MEDIA_URL

    MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder
    MEDIA_URL = '/media/'
    

    然后通过添加在TEMPLATE_CONTEXT_PROCESSORS 中启用media context_processors

    TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                #here add your context Processors
                'django.template.context_processors.media',
            ],
        },
    },
    ]
    

    您的media context processor 已启用,现在每个RequestContext 都将包含一个变量MEDIA_URL

    现在您可以在 template_name.html 中访问它

    <p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>
    

    【讨论】:

    • 很好地解释了——这就是我的答案。关键是添加媒体上下文处理器
    • 非常好context_processors小费
    【解决方案5】:

    我需要为上传的媒体设置特定的 URLconf 模式吗?

    是的。对于开发,只需将其添加到您的 URLconf 中即可:

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

    但是,对于生产,您需要使用 Apache、lighttpd、nginx 或您喜欢的 Web 服务器来提供媒体。

    【讨论】:

    • 什么意思,你如何配置服务器?
    • 我得到一个未解决的“模式”引用,是从某个地方导入的吗?
    【解决方案6】:

    (至少)对于 Django 1.8:

    如果你使用

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

    如上所述,请确保在 urlpatterns = [] 中没有指向默认视图的“catch all” url 模式。由于 .append 会将添加的方案放在列表的末尾,当然只有在没有以前的 url 模式匹配时才会对其进行测试。您可以通过使用类似这样的方法来避免这种情况,其中在最后添加“catch all” url 模式,独立于 if 语句:

    if settings.DEBUG:
        urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))
    
    urlpatterns.append(url(r'$', 'views.home', name='home')),
    

    【讨论】:

      【解决方案7】:

      为了使用 Django 1.10.6 为 django-publications 应用程序提供 PDF,我必须进行以下更改:

      settings.py 中使用了与您相同的媒体目录定义:

      MEDIA_ROOT = '/home/user/mysite/media/'
      
      MEDIA_URL = '/media/'
      

      由@thisisashwanipandey 提供,在项目主urls.py

      from django.conf import settings
      from django.conf.urls.static import static
      
      urlpatterns = [
          # ... the rest of your URLconf goes here ...
      ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
      

      以及@r-allela 在settings.py 中提供的答案的修改:

      TEMPLATES = [
          {
              'BACKEND': 'django.template.backends.django.DjangoTemplates',
              'DIRS': [os.path.join(BASE_DIR, 'templates')],
              'APP_DIRS': True,
              'OPTIONS': {
                  'context_processors': [
                      # ... the rest of your context_processors goes here ...
                      'django.template.context_processors.media',
                  ],
               },
          },
      ]
      

      【讨论】:

        【解决方案8】:

        在设置完所有 URLconf 模式后,您可能会遇到的另一个问题是变量 {{ MEDIA_URL }} 在您的模板中不起作用。要解决此问题,请确保在您的 settings.py 中添加

        django.core.context_processors.media

        在你的TEMPLATE_CONTEXT_PROCESSORS

        【讨论】:

        • 这是更好的选择,但 'django.template.context_processors.media' 对我有用
        【解决方案9】:

        按照上面提到的 =>3.0 调试模式的步骤

        urlpatterns = [
        ...
        ]
        + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
        

        还有让我印象深刻的部分,上面的静态 URL 只在我的主项目 urls.py 文件中有效。我第一次尝试添加到我的应用中,并想知道为什么我看不到图像。

        最后确保您设置了以下内容:

        MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
        MEDIA_URL = '/media/'
        

        【讨论】:

          【解决方案10】:

          如果您使用的是 python 3.0+,请按如下方式配置您的项目

          设置

          STATIC_DIR = BASE_DIR / 'static'
          MEDIA_DIR = BASE_DIR / 'media'
          MEDIA_ROOT = MEDIA_DIR
          MEDIA_URL = '/media/'
          

          主要网址

          from django.conf import settings
          from django.conf.urls.static import static
          
          urlspatterns=[
          ........
          ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
          

          【讨论】:

            【解决方案11】:

            添加到 django 1.8 的 Micah Carrick 答案:

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

            【讨论】:

            • 对我不起作用 (1.10)。 TypeError: view must be a callable or a list/tuple in the case of include()..
            【解决方案12】:

            如果适用于 Django 1.10:

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

            【讨论】:

              【解决方案13】:

              这就是我在 Python 3.6 和 Django 1.11 中的 DEBUG = False 模式下实现图像渲染的方法

              from django.views.static import serve
              urlpatterns = [
              url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
              # other paths
              ]
              

              【讨论】:

                【解决方案14】:

                在生产环境中,Django 不会自动加载媒体根目录,因此我们可以通过在 URL 模式之后添加以下代码来解决该问题:

                urlpatterns = [
                       ''''
                         your urls
                       ''''
                    ] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
                    if settings.DEBUG:
                        urlpatterns += static(settings.MEDIA_URL,
                                              document_root=settings.MEDIA_ROOT)
                

                如果您使用多个应用程序,并且如果您在主应用程序 url 中包含应用程序 url,只需在主项目 URL 上添加此代码(配置)。

                【讨论】:

                  【解决方案15】:

                  你的设置没问题。一些 Web 服务器需要专门指定媒体和静态文件夹文件。例如,在 pythonanywhere.com 中,您必须转到“Web”部分并添加媒体文件夹和静态文件夹的 url。例如:

                    URL                     Directory                
                  /static/            /home/Saidmamad/discoverthepamirs/static     
                  /accounts/static/   /home/Saidmamad/discoverthepamirs/accounts/static    
                  /media/            /home/Saidmamad/discoverthepamirs/discoverthepamirs/media    
                  

                  我知道已经晚了,但只是为了帮助那些因为同样的问题而访问此链接的人;)

                  【讨论】:

                    【解决方案16】:

                    对于开发中的 Django 3.0+,您的主 urls.py 中有以下内容:

                    urlpatterns = [
                       # rest of your url paths here..
                    ]
                    
                    from django.conf import settings
                    from django.conf.urls.static import static
                    
                    if settings.DEBUG:
                        urlpatterns += (
                            static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +
                            static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
                            )
                    

                    【讨论】:

                      【解决方案17】:

                      这是答案 Images from media folder is not displaying django template

                      享受你的工作......

                      【讨论】:

                        猜你喜欢
                        • 2011-06-16
                        • 2023-01-09
                        • 2013-07-22
                        • 1970-01-01
                        • 2023-03-06
                        • 1970-01-01
                        • 2015-07-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多