STATICFILES_DIR,STATIC_ROOT和MEDIA_ROOT之间的差异


77

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

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

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

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

和我的settings.py

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

我添加了custom.jsSTATIC_ROOT/admin/custom.js,但它不工作。抛出404找不到错误。

然后我将更STATIC_ROOT改为STATICFILES_DIRS,它可以正常工作!

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

所以,我不明白这里发生了什么。实际上,我只是不了解STATIC_ROOT和之间的区别STATICFILES_DIRS

目前,我正在通过virtualenv在我的机器上测试Django,但尚未部署,这是原因STATIC_ROOT吗?


1
另见我如何静态文件进行图形生产工作:djangodeployment.com/2016/11/21/...
安东尼斯·赫里斯托菲

Answers:


114

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

  • MEDIA_ROOT是用来上传文件的文件夹FileField

    存放用户上传文件的目录的绝对文件系统路径。

  • STATIC_ROOT 是使用后将存储静态文件的文件夹 manage.py collectstatic

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

    如果staticfiles启用了contrib应用程序(默认),则collectstatic管理命令会将静态文件收集到该目录中。有关用法的更多详细信息,请参见如何管理静态文件。

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

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

在设置中,您应该具有:

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__)))

settings.py现在在默认Django中定义。


3
这很容易是IMO的最明确答案,尽管我觉得这个问题很确定
Ian Clark

3
@MaximeLorant老实说,您的解释比Django文档要好。

1
@MaximeLorant构建精美的答案。正如Jee所说,比文档本身要清晰得多。
尼尔·希克曼

122

发展历程

STATIC_ROOT 在开发过程中是无用的,仅在部署时需要。

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

这是manage.py runserverwhen的魔力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/'),
]

18
STATIC_ROOT等的最佳解释。简洁明了。这就是django文档中的内容。
Homunculus Reticulli

1
@Max Malysh是我们应该有的答案。得到它了!A +
adhg '18

1
很多阐明。谢谢!
MadPhysicist,

23

STATICFILES_DIRS和之间的区别STATIC_ROOT

STATICFILES_DIRS可以包含其他目录(不一定是应用程序的目录)与静态文件和这些静态文件,当您运行将被收集到您的STATIC_ROOT collectstatic。然后,这些静态文件将由您的Web服务器提供,并且将从您的STATIC_ROOT中提供。

如果您当前要在STATIC_ROOT中保存要提供的文件,则需要将其移动到其他目录,然后将该其他目录放入中STATICFILES_DIRS。您的STATIC_ROOT目录应该为空,所有静态文件都应收集到该目录中。

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


4
谢谢你的回答。希望我可以接受一个以上的答案。您的回答对我也很有帮助。
dev-jim 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.