[英]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.