簡體   English   中英

Django MEDIA_URL 和 MEDIA_ROOT

[英]Django MEDIA_URL and 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 模式?

任何建議表示贊賞。

謝謝。

更新 Django >= 1.7

根據 Django 2.1 文檔: 在開發期間提供用戶上傳的文件

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時提供靜態媒體

請仔細閱讀官方 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.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 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_PROCESSORSmedia 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>

我是否需要為上傳的媒體設置特定的 URLconf 模式?

是的。 對於開發,只需將其添加到您的 URLconf 中即可:

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

但是,對於生產,您需要使用 Apache、lighttpd、nginx 或您首選的 Web 服務器來提供媒體服務。

(至少)對於 Django 1.8:

如果你使用

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

如上所述,請確保在 urlpatterns = [] 之前沒有指向默認視圖的“全部捕獲”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')),

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

設置所有 URLconf 模式后您可能面臨的另一個問題是變量{{ MEDIA_URL }}在您的模板中不起作用。 要解決此問題,請確保在settings.py 中添加

django.core.context_processors.media

在您的TEMPLATE_CONTEXT_PROCESSORS

對於調試模式,按照上面提到的 =>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/'

添加到 Micah Carrick 對 Django 1.8 的回答:

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

這對於 Django 1.10:

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

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

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

將此代碼添加到“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)

你的設置沒問題。 某些 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    

我知道已經晚了,但只是為了幫助那些因為同樣的問題而訪問此鏈接的人;)

對於開發中的 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)
        )

在生產環境中,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 上添加它。

在 settings.py 中添加此代碼

網址模式 = [

……

……

]+ 靜態(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM