ChatGPT解决这个技术问题 Extra ChatGPT

Django MEDIA_URL 和 MEDIA_ROOT

我正在尝试通过 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 模式?

任何建议表示赞赏。

谢谢。


M
Micah Carrick

更新 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 <= 1.6 的原始答案

尝试将其放入您的 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


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

请仔细阅读官方 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 检查,因为它已自动禁用?
t
thisisashwani

对于 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 中有任何必要的基础设置?
A
Akhilendra

这是我在 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提示
m
mipadi

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

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

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

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


这是什么意思你如何配置服务器?
我得到一个未解决的“模式”引用,是从某个地方导入的吗?
S
S. Ju.

(至少)对于 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')),

A
Alex Willison

以下是我使用 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',
            ],
         },
    },
]

v
vishes_shell

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

django.core.context_processors.media

在您的 TEMPLATE_CONTEXT_PROCESSORS 中。


这是更好的选择,但 'django.template.context_processors.media' 对我有用
G
Gavin

按照上面提到的 =>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/'

A
Alok Kumar Maurya

如果您使用的是 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)

u
user3894045

添加到 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().
J
Jose Luis Quichimbo

这对于 Django 1.10:

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

c
comiventor

这就是我在 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
]

M
Madhav Dhungana

在生产环境中,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 上添加此代码(配置)。


S
Saidmamad

你的设置没问题。一些 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    

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


N
Nick

对于开发中的 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)
        )

K
Kai - Kazuya Ito

将此代码添加到“settings.py”以访问(打开或显示)上传的文件:

# "settings.py"

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)