STATICFILES_DIR,STATIC_ROOT和MEDIA_ROOT之间的差异

时间:2014-06-03 18:39:52

标签: python django django-staticfiles django-static

这三个静态网址有什么区别?

我不确定我是否正确,我使用MEDIA_ROOT存储我上传的照片(通过models.ImageField()

但是,我为管理员和admin.py创建了一个JS脚本。我将媒体定义如下:

....
class Media:
      js = ('/admin/custom.js', )

和我的settings.py

 ....
 STATIC_ROOT = "/home/user/project/django1/top/listing/static"

我将custom.js添加到STATIC_ROOT/admin/custom.js,但它无效。投掷404未找到错误。

然后我将STATIC_ROOT更改为STATICFILES_DIRS,然后就可以了!

....
STATICFILES_DIRS = "/home/user/project/django1/top/listing/static"

所以,我不明白这里发生了什么。事实上,我只是不明白STATIC_ROOTSTATICFILES_DIRS之间的区别。

目前我正在通过virtualenv在我的机器上测试Django,尚未部署,是STATIC_ROOT无法正常工作的原因吗?

4 个答案:

答案 0 :(得分:71)

您可以在Django documentation中找到这些设置。以下是我自己的文档定义和引文:

  • MEDIA_ROOT是使用FileField上传文件的文件夹。

      

    将保留user-uploaded files的目录的绝对文件系统路径。

  • STATIC_ROOT是使用manage.py collectstatic

    后存储静态文件的文件夹
      

    collectstatic将收集静态文件以进行部署的目录的绝对路径。

         

    如果staticfiles contrib app已启用(默认),collectstatic管理命令将收集静态文件到此目录中。有关使用的更多详细信息,请参阅有关管理静态文件的方法。

  • STATICFILES_DIRS是Django将搜索除安装的每个应用的static文件夹之外的其他静态文件的文件夹列表。

      

    此设置定义了在启用FileSystemFinder查找程序时staticfiles应用程序将遍历的其他位置,例如如果您使用collectstaticfindstatic管理命令或使用静态文件服务视图。

在您的设置中,您应该:

MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")

# Make a tuple of strings instead of a string
STATICFILES_DIRS = ("/home/user/project/django1/top/listing/static", )

...其中:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

现在默认为Django settings.py

答案 1 :(得分:63)

开发

STATIC_ROOT在开发过程中无用,只需部署即可。

在开发过程中,STATIC_ROOT什么也没做。你甚至不需要设置它。 Django在每个应用程序的目录(myProject/appName/static)中查找静态文件并自动提供。

这是manage.py runserver DEBUG=True时所做的魔术。

部署

当您的项目上线时,情况会有所不同。很可能你会使用Django提供动态内容,静态文件将由Nginx提供。为什么?因为Nginx非常高效,可以减少Django的工作量。

这是STATIC_ROOT变得方便的地方,因为Nginx对你的django项目一无所知,也不知道在哪里找到静态文件。

因此,您设置STATIC_ROOT = '/some/folder/'并告诉Nginx在/some/folder/中查找静态文件。然后运行manage.py collectstatic,Django会将您拥有的所有应用中的静态文件复制到/some/folder/

静态文件的额外目录

STATICFILES_DIRS用于包含collectstatic要查找的其他目录。例如,默认情况下,Django无法识别/myProject/static/。所以你可以自己加入。

实施例

STATIC_URL = '/static/'

if not DEBUG: 
    STATIC_ROOT = '/home/django/www-data/site.com/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static/'),
]

答案 2 :(得分:19)

STATICFILES_DIRSSTATIC_ROOT

之间的差异

STATICFILES_DIRS可以包含带有静态文件的其他目录(不一定是app目录),当您运行collectstatic时,这些静态文件将被收集到您的STATIC_ROOT中。然后,这些静态文件将由您的Web服务器提供,它们将从您的STATIC_ROOT提供。

如果您希望提供STATIC_ROOT中的文件,那么您需要将这些文件移到另一个目录并将其他目录放在STATICFILES_DIRS中。您的STATIC_ROOT目录应为空,并且应将所有静态文件收集到该目录中。

MEDIA_ROOT媒体文件,所有上传的文件都在其中。 示例:图像,文件

答案 3 :(得分:0)

class Media:
      js = ('/admin/custom.js', )
<块引用>

但它不起作用。抛出 404 not found 错误。

404 错误的部分原因是文件路径中的前导斜杠。