[英]MEDIA_ROOT vs MEDIA_URL (Django)
我閱讀了有關MEDIA_ROOT和MEDIA_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”永遠不會影響媒體文件 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.