MEDIA_ROOT与MEDIA_URL(Django)的区别

3

我阅读了关于 MEDIA_ROOTMEDIA_URL 的文档,对它们有了一些了解,但还是不太清楚。

MEDIA_ROOT:

MEDIA_URL:

通常情况下,我们可以看到以下示例:

# "settings.py"

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

那么,"MEDIA_ROOT""MEDIA_URL" 究竟是什么?

1个回答

8

首先,我将解释"MEDIA_ROOT""MEDIA_URL"

<MEDIA_ROOT>

"MEDIA_ROOT"设置上传文件存储的绝对路径目录设置" MEDIA_ROOT "绝不会影响媒体文件的URL

例如,我们有一个Django项目:

enter image description here

然后,我们将在我的Windows电脑上设置为"C:\Users\kai\django-project\media"的"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)

并将模型“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"

enter image description here

然后,在与 "db.sqlite3""manage.py" 同级的位置创建了一个名为"media" folder的文件夹,它是在django项目根目录下方,上传的文件 "orange.jpg" 存储在下面所示的 "media" 文件夹中:

enter image description here

然后,上传更多文件:

enter image description here

此外,我们可以通过在“更改图像”页面上单击下面所示的“orange.jpg”来显示文件“orange.jpg”。请参考以下内容:

enter image description here

然后,文件 "orange.jpg" 如下所示显示:

enter image description here

请注意,如果您从 "urls.py" 中删除下面的代码:

# "core/urls.py"

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

然后,文件"orange.jpg"没有显示。相反,会出现以下错误:

enter image description here

下一步,您可以将上传的文件存储在更多子目录下,我将介绍两种方法来实现这一点,第一种方法是推荐的,因为它具有灵活性,而第二种方法则不推荐,因为它完全没有灵活性。
将上传的文件存储在更多子目录中的第一种方法是首先将"os.path.join(BASE_DIR, 'media')"设置为"MEDIA_ROOT",如下所示:
# "core/settings.py"

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

另外,在 "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)

然后,上传的文件按照我的情况,在Windows操作系统中存储在"C:\Users\kai\django-project\media\images\fruits"中:

enter image description here

将上传的文件存储在更多的子目录下的第二种方法是,首先将'media/images/fruits'设置为"os.path.join()"的第二个参数,如下所示:
# "core/settings.py"
                                    # Here
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/images/fruits')
MEDIA_URL = '/media/'

请设置“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)

然后,上传的文件按照我的情况在Windows中存储在"C:\Users\kai\django-project\media\images\fruits"下面,如下所示。但是正如我之前所说,第一种方法是推荐的,因为它更加灵活,而第二种方法则完全不灵活:

enter image description here

此外,如果我们不按照下面所示设置“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/'

并且将"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项目根目录下方,如下所示:

enter image description here

此外,如果我们在上传文件后更改了"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":

enter image description here

然后,在文件的“更改图像”页面上,如下所示,单击“images/fruits/orange.jpg”

enter image description here

然后,文件"orange.jpg"如下所示显示:

enter image description here

现在,我们将"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”,如下所示:

enter image description here

然后,"orange.jpg"文件没有显示。相反,出现了以下错误:

enter image description here

接着,就像我之前说的那样,即使我们在上传文件后更改了"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”,如下所示:

enter image description here

然后,文件"orange.jpg"如下所示显示:

enter image description here

<MEDIA_URL>

接下来,我将解释"MEDIA_URL"

"MEDIA_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

请将“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":

enter image description here

然后,前往文件的“更改图片”页面,然后单击“orange.jpg”

enter image description here

接下来,文件的URL将会显示如下:

enter image description here

正如您所看到的,目录部分“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”

enter image description here

然后,目录部分“media”被更改为“image/fruits”,如下所示:

enter image description here

此外,我们可以通过将 "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"

enter image description here

然后,前往文件的“更改图像”页面,然后单击“images/fruits/orange.jpg”:

enter image description here

然后,文件的URL如下所示显示:the URL of the file

enter image description here

然后,目录部分是:

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":

enter image description here

然后,文件的URL如下所示显示:

enter image description here

然后,在上传文件 "orange.jpg" 后,我们可以更改由 "MEDIA_URL" 设置的目录部分 "media" 的一部分为 "hello/world",而在上传文件 "orange.jpg" 后,我们无法更改由 "models.ImageField()" 设置的目录部分 "images/fruits" 的一部分为 "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

并将"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”之间没有设置目录部分:

enter image description here

http://localhost:8000/orange.jpg

非常好的解释。谢谢! - Komov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接