Django静态文件和用户上传文件的区别

7

在阅读了大量文档之后,我仍然不太明白什么算是静态文件,什么算是用户上传的文件……甚至对于什么是静态文件也不是很清楚。

1. 静态文件

Django将静态文件描述为像“图像、JavaScript和CSS”这样的东西。好的,有道理。但是那些.py文件和.html模板文件等等……它们不是静态的吗?它们在站点运行时不会“更改”。什么是静态文件?什么是“提供静态文件”?这与“提供”“views.py”文件或“home.html”文件有何不同?

此外,我为什么需要“collectstatic”呢?为什么所有我的静态文件都需要放在一个地方?我想如果您使用单独的Web服务器来“提供”它们,这就有意义了……但是,我仍然不确定这到底是什么意思。

另外,“collectstatic”到底去哪里找到所有所谓的静态文件?它是否会查看我所有的代码并查找我访问的图像/ JavaScript文件?

2. 用户上传的文件

如果我只是单纯地接受这个静态的东西,那么如果用户上传了一张图片会发生什么?我需要在后台运行一个不断运行“collectstatic”的程序吗?
Django 描述 媒体文件作为管理用户上传内容的一种方式。老实说,我还没有尝试过这个(现在会尝试),但这仍然代表一个问题:如果将所有“静态”文件放在一个地方如此重要,为什么对于用户上传的文件突然不需要这样做呢?
这个“MEDIA_ROOT”目录里的文件是否不被“collectstatic”收集?如果我把所有的图片/ JavaScript / CSS都放到这个媒体文件夹中,那么什么都不会被收集?这样做有什么问题吗?
感谢任何人能够提供的见解。
3个回答

3

1

静态文件是HTML模板所需的一切内容,包括CSS、JavaScript、图像、Flash文件等。它们被视为不同的内容,因为Django对此没有特殊处理。(与views.py文件中必须运行Python代码相比,与模板不同,需要渲染您使用的任何模板标签等。而对于静态资产,它们只需要按原样提供给用户即可)

collectstatic命令将查找每个应用程序的“static”子目录以及您在STATICFILES_DIRS设置中定义的任何其他目录。这意味着您的Web服务器(Apache、Nginx等)只需要提供一个目录,就可以将所有资产提供给用户,而不是每个单独的应用程序的“static”目录。

2

用户上传的文件不会被collectstatic命令收集,可以单独保存。您不想将自己的CSS/JS/图像等与它们混合在一起。

它们已经放置在一个可由您的Web服务器提供的单个目录中,根本不需要定期收集。


2
什么是静态文件?
静态文件是您在项目中创建的文件,需要直接发送到浏览器(通常是JavaScript、CSS和图像)。您的Python文件(如views.py)不会直接发送到浏览器,它们会进行一些处理来创建将发送到浏览器的HTML文件。
什么是“提供静态文件”?
提供静态文件是通过Web服务器以响应Web请求发送文件。
我为什么需要“collectstatic”?
collectstatic使用settings.py中的STATICFILES_DIRS变量查找所有静态文件并将它们放在一个地方。在生产服务器上必须这样做,因为该文件夹应具有与项目文件不同的安全设置。例如,您不希望用户能够下载model.py。
collectstatic也可以使用类似django-pipeline的东西进行缩小和混淆。
我需要在后台运行一个不断运行“collectstatic”的程序吗?
不需要,媒体文件是另一回事。这些是用户上传到您的系统的文件(与您创建的静态文件不同)。这些文件通常保存在服务器上的文件系统中,并在数据库中创建一个记录,其中包含指向文件的地址和在模型中定义的一些元数据。models.FileField具有upload_to属性,该属性控制这些文件相对于settings.py中的MEDIA_ROOT变量存储在何处。
这些文件应该与您的项目文件分开存储在服务器上,甚至可以存储在其他服务器上,以便在更新站点时保持不变。

1
大部分答案已经在文档中提供:
  1. https://docs.djangoproject.com/en/1.8/ref/contrib/staticfiles/ - Django如何查找静态文件等

  2. https://docs.djangoproject.com/en/1.8/howto/static-files/ - 在开发环境中如何提供静态文件

  3. https://docs.djangoproject.com/en/1.8/howto/static-files/deployment/ - 在生产环境中如何提供静态文件以及通过fabric自动收集静态文件的简介。

简单来说:静态文件是负责您网站外观而非结构和信息呈现(如css、js、img、视频等)的文件。

在开发环境中,您将所有静态文件放在static文件夹中,它会被自动服务于开发服务器中。

当您使用Pro版本时,静态文件应存储在项目目录之外的staticfiles/static文件夹中。媒体文件应存储在staticfiles/media中(您可以为这些目录指定其他名称)。这样做有两个原因:安全性和所有静态文件由单独的Web服务器提供服务。您可能希望在每次更改时自动运行collectstatic-尝试使用fabric。用户已经上传了所有媒体文件,因此您不需要运行collectstatic。

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