簡體   English   中英

MEDIA_ROOT 與 MEDIA_URL(Django)

[英]MEDIA_ROOT vs MEDIA_URL (Django)

我閱讀了有關MEDIA_ROOTMEDIA_URL的文檔,然后我可以稍微了解它們,但了解不多。

媒體根目錄

媒體網址

我經常看到它們如下所示:

# "settings.py"

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

那么, “MEDIA_ROOT”“MEDIA_URL”到底是什么?

首先,我解釋一下“MEDIA_ROOT” ,然后是“MEDIA_URL”

<MEDIA_ROOT>

“MEDIA_ROOT”設置上傳文件存儲目錄的絕對路徑,設置“MEDIA_ROOT”永遠不會影響媒體文件 URL

比如我們有一個django的項目:

在此處輸入圖像描述

然后,我們將“os.path.join(BASE_DIR, 'media')”設置為“MEDIA_ROOT”

# "core/settings.py"

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

並將下面的代碼設置為“urls.py”

# "core/urls.py"

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

並設置model“Image”如下圖:

# "myapp/models.py"

class Image(models.Model):
    image = models.ImageField()

    def __str__(self):
        return str(self.image)

並將下面的代碼設置為“admin.py”

# "myapp/admin.py"

from .models import Image

admin.site.register(Image)

然后,上傳文件“orange.jpg”

在此處輸入圖像描述

然后,在 django 項目根目錄下創建與“db.sqlite3”“manage.py”相同級別的“media”文件夾,上傳的文件“orange.jpg”存儲在“media”文件夾中如下所示:

在此處輸入圖像描述

然后,上傳更多文件:

在此處輸入圖像描述

另外,我們可以在文件的“更改圖片”頁面點擊 orange.jpg”來顯示文件“orange.jpg” ,如下圖:

在此處輸入圖像描述

然后,文件“orange.jpg”顯示如下:

在此處輸入圖像描述

請注意,如果您從“urls.py”中刪除以下代碼:

# "core/urls.py"

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

然后,不顯示文件“orange.jpg” 相反,出現如下所示的錯誤:

在此處輸入圖像描述

接下來,您可以將上傳的文件存儲在更多的子目錄下,我解釋了兩種方法,推薦第一種方式,因為它靈活,不推薦第二種方式,因為它根本不靈活。

將上傳的文件存放在更多子目錄下的第一種方法是首先將“os.path.join(BASE_DIR, 'media')”設置為“MEDIA_ROOT” ,如下所示:

# "core/settings.py"

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

並且,將“upload_to='images/fruits'”添加到“models.ImageField()” ,如下所示:

# "myapp/models.py"

from django.db import models  

class Image(models.Model):    # Here
    image = models.ImageField(upload_to='images/fruits')

    def __str__(self):
        return str(self.image)

然后,上傳的文件存儲在“C:\Users\kai\django-project\media\images\fruits”中,在我的例子中是Windows,如下圖:

在此處輸入圖像描述

第二種將上傳的文件存儲在更多子目錄下的方法是首先將'media/images/fruits'設置為“os.path.join()”的第二個參數,如下所示:

# "core/settings.py"
                                    # Here
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/images/fruits')
MEDIA_URL = '/media/'

並將no arguments設置為“models.ImageField()” ,如下所示:

# "myapp/models.py"

from django.db import models  

class Image(models.Model): 
    image = models.ImageField() # Here

    def __str__(self):
        return str(self.image)

然后,上傳的文件存儲在“C:\Users\kai\django-project\media\images\fruits”中,在我的例子中是Windows,如下所示,但正如我之前所說,推薦第一種方式,因為它靈活,而第二種方式根本不靈活:

在此處輸入圖像描述

另外,如果我們不設置“MEDIA_ROOT” ,如下圖:

# "core/settings.py"

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

或者將空字符串設置為“os.path.join()”的第二個參數,如下所示:

# "core/settings.py"
                                  
MEDIA_ROOT = os.path.join(BASE_DIR, '') # Here
MEDIA_URL = '/media/'

或者不設置“os.path.join()”的第二個參數,如下所示:

# "core/settings.py"

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

並將no arguments設置為“models.ImageField()” ,如下所示:

# "myapp/models.py"

from django.db import models  

class Image(models.Model): 
    image = models.ImageField() # Here

    def __str__(self):
        return str(self.image)

然后,上傳的文件存儲在與“db.sqlite3”“manage.py”相同的級別,就在 django 項目根目錄下,如下所示:

在此處輸入圖像描述

另外,上傳文件后,如果我們改變“MEDIA_ROOT” ,我們不能顯示上傳的文件,而即使我們改變“models.ImageField()” ,我們仍然可以顯示上傳的文件。

例如,我們將“os.path.join(BASE_DIR, 'media')”設置為“MEDIA_ROOT”

# "core/settings.py"

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

並且,將“upload_to='images/fruits'”設置為“models.ImageField()” ,如下所示:

# "myapp/models.py"

from django.db import models  

class Image(models.Model):    # Here
    image = models.ImageField(upload_to='images/fruits')

    def __str__(self):
        return str(self.image)

然后,上傳文件“orange.jpg”

在此處輸入圖像描述

然后,在文件的“更改圖像”頁面上單擊“圖像/水果/orange.jpg” ,如下所示:

在此處輸入圖像描述

然后,文件“orange.jpg”顯示如下:

在此處輸入圖像描述

現在,我們將“MEDIA_ROOT”“os.path.join(BASE_DIR, 'media')”更改為“os.path.join(BASE_DIR, 'hello/world')”

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'hello/world') # Here
MEDIA_URL = '/media/'

然后再次點擊文件“更改圖像”頁面上的“images/fruits/orange.jpg” ,如下圖所示:

在此處輸入圖像描述

然后,不顯示文件“orange.jpg” 相反,出現如下所示的錯誤:

在此處輸入圖像描述

然后,正如我之前所說,即使我們在上傳文件后更改“models.ImageField()” ,我們仍然可以顯示上傳的文件。 所以現在,我們將“MEDIA_ROOT”“os.path.join(BASE_DIR, 'hello/world')”改回“os.path.join(BASE_DIR, 'media')”

# "core/settings.py"

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

並且,將“models.ImageField(upload_to='images/fruits')”更改為“models.ImageField(upload_to='hello/world')”

# "myapp/models.py"

from django.db import models  

class Image(models.Model):    # Here
    image = models.ImageField(upload_to='hello/world')

    def __str__(self):
        return str(self.image)

然后再次點擊文件“更改圖像”頁面上的“images/fruits/orange.jpg” ,如下圖所示:

在此處輸入圖像描述

然后,文件“orange.jpg”顯示如下:

在此處輸入圖像描述

<媒體網址>

接下來,我解釋一下“MEDIA_URL”

“MEDIA_URL”在主機部分和媒體文件 URL 的文件部分之間設置媒體文件 URL 的目錄(中間)部分,如下所示,設置“MEDIA_URL”永遠不會影響上傳文件存儲目錄的絕對路徑

             Host        Directory      File
               |             |           |
        <-------------> <----------> <-------->      
https://www.example.com/media/images/orange.jpg

例如,我們將'/media/'設置為"MEDIA_URL"

# "core/settings.py"

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

並將no arguments設置為“models.ImageField()” ,如下所示:

# "myapp/models.py"

from django.db import models  

class Image(models.Model): 
    image = models.ImageField() # Here

    def __str__(self):
        return str(self.image)

然后,上傳文件“orange.jpg”

在此處輸入圖像描述

然后,go 到文件的“更改圖像”頁面,然后單擊“orange.jpg”

在此處輸入圖像描述

然后,文件的URL顯示如下:

在此處輸入圖像描述

如您所見,目錄部分“media”設置在主機部分“localhost:8000”文件部分“orange.jpg”之間

            Host    Directly   File
              |         |       |
       <------------> <---> <-------->      
http://localhost:8000/media/orange.jpg

並且,下面的這個 URL 在這種情況下是帶有“https”“www.example.com ”:

             Host     Directly   File
               |          |       |
        <-------------> <---> <-------->      
https://www.example.com/media/orange.jpg

而且,我們甚至可以在上傳文件后更改URL 的目錄部分

因此,只需將“MEDIA_URL”“/media/”更改為“/images/fruits/” ,如下所示:

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/images/fruits/' # Here

然后,再次點擊“orange.jpg”

在此處輸入圖像描述

然后,目錄部分“media”更改為“image/fruits” ,如下所示:

在此處輸入圖像描述

另外,我們可以通過組合 "MEDIA_URL" 和 "models.ImageField()" 來設置 URL 的目錄部分 在這種情況下,我們只能在上傳文件后更改“MEDIA_URL”設置的目錄部分,而不能在上傳文件后更改“models.ImageField ()”設置的目錄部分

例如,我們將'/media/'設置為“MEDIA_URL” ,如下所示:

# "core/settings.py"

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

並在“models.ImageField ()”中添加“upload_to='images/fruits'” ,如下圖:

# "myapp/models.py"

from django.db import models  

class Image(models.Model):    # Here
    image = models.ImageField(upload_to='images/fruits')

    def __str__(self):
        return str(self.image)

然后,上傳文件“orange.jpg”

在此處輸入圖像描述

然后,go 到文件的“更改圖像”頁面,然后單擊“圖像/水果/orange.jpg”

在此處輸入圖像描述

然后,文件的URL顯示如下:

在此處輸入圖像描述

然后,目錄部分是:

media/images/fruits

現在,我們將“MEDIA_URL”“/media/”更改為“/hello/world/”

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/hello/world/' # Here

並且,將“models.ImageField(upload_to='images/fruits')”更改為“models.ImageField(upload_to='hey/earth')”

# "myapp/models.py"

from django.db import models  

class Image(models.Model):              # Here
    image = models.ImageField(upload_to='hey/earth')

    def __str__(self):
        return str(self.image)

然后,再次點擊“images/fruits/orange.jpg”

在此處輸入圖像描述

然后,文件的URL顯示如下:

在此處輸入圖像描述

然后,我們可以在上傳文件“orange.jpg ”后將目錄部分“media”的部分更改為“MEDIA_URL”設置的“hello/world” ,而我們無法更改目錄部分“images/fruits” '上傳文件“orange.jpg”由“models.ImageField()”設置的'hey/earth'

hello/world/images/fruits

另外,如果我們不設置“MEDIA_URL” ,如下圖:

# "core/settings.py"

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

或者將空字符串設置為“MEDIA_URL” ,如下所示:

# "core/settings.py"
                                  
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '' # Here

或者給“MEDIA_URL”設置一個或多個斜杠,如下圖:

# "core/settings.py"

MEDIA_ROOT = os.path.join(BASE_DIR)
MEDIA_URL = '/////' # Here

並將no arguments設置為“models.ImageField()” ,如下所示:

# "myapp/models.py"

from django.db import models  

class Image(models.Model): 
    image = models.ImageField() # Here

    def __str__(self):
        return str(self.image)

然后,主機部分“localhost:8000”文件部分“orange.jpg”之間沒有設置目錄部分,如下所示:

在此處輸入圖像描述

http://localhost:8000/orange.jpg

暫無
暫無

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

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