Python 什么';这是Django的观点';它是静态的吗?
这可能是一个愚蠢的问题,但它只是没有点击在我的脑袋 在Django中,惯例是将特定于应用程序的所有静态文件(即css、js)放入名为static的文件夹中。因此,结构将如下所示:Python 什么';这是Django的观点';它是静态的吗?,python,django,django-staticfiles,static-files,collectstatic,Python,Django,Django Staticfiles,Static Files,Collectstatic,这可能是一个愚蠢的问题,但它只是没有点击在我的脑袋 在Django中,惯例是将特定于应用程序的所有静态文件(即css、js)放入名为static的文件夹中。因此,结构将如下所示: mysite/ manage.py mysite/ --> (settings.py, etc) myapp/ --> (models.py, views.py, etc) static/ 在mysite/settings.py中,我有: STATIC_ROOT =
mysite/
manage.py
mysite/ --> (settings.py, etc)
myapp/ --> (models.py, views.py, etc)
static/
在mysite/settings.py
中,我有:
STATIC_ROOT = 'staticfiles'
因此,当我运行命令时:
python manage.py collectstatic
它在根级别创建一个名为staticfiles
的文件夹(与myapp/
目录相同)
这有什么意义?它不只是创建我所有静态文件的副本吗 将多个应用程序中的静态文件收集到单个路径中
好的,一个Django项目可能会使用多个应用程序,所以虽然在那里你只有一个myapp
,但它实际上可能是myapp1
,myapp2
,等等
通过将它们从各个应用程序内部复制到单个文件夹中,您可以将前端web服务器(例如nginx)指向该单个文件夹STATIC\u ROOT
,并从单个位置提供静态文件,而不是将web服务器配置为从多个路径提供静态文件
带有
关于将MD5哈希附加到文件名以进行版本控制的注意事项:它不是collectstatic
的默认行为的一部分,因为settings.STATICFILES\u STORAGE
默认为StaticFilesStorage
(这不起作用)
MD5散列将启动,例如,如果您将其设置为使用ManifestStaticFilesStorage
,则会显示该行为
此存储的目的是保持对旧文件的服务,以防
某些页面仍然引用这些文件,例如,因为它们是由
您或第三方代理服务器。此外,如果
您想将far future Expires头应用于部署到的文件
加快后续页面访问的加载时间
当站点中有多个django应用程序时,它非常有用
collectstatic
然后将从一个位置收集所有应用程序中的静态文件,以便可以在生产环境中提供这些文件。在生产安装中,您希望有持久的URL。除非文件内容发生更改,否则URL不会更改
这是为了防止客户端在从Django打开网页时在其计算机上使用错误版本的CSS或JS文件。Django staticfiles检测文件更改并相应地更新URL,因此如果CSS或JS文件更改,web浏览器将下载新版本
这通常是通过在
collectstatic
运行期间向文件名添加MD5哈希来实现的
编辑:另请参阅多个应用程序的相关答案。Django静态文件可以在许多地方。可以使用充当
/static/img/icon.png
的文件。默认情况下:
将在每个FileSystemFinder
中查找STATICFILES\u DIRS
img/icon.png
将在每个AppDirectoriesFinder
已安装的应用程序的
静态子文件夹中查找
。这允许像Django Admin这样的库将它们自己的静态文件添加到您的应用程序中img/icon.png
manage.py runserver
时有效。当您上线时,Django进程将不再为静态资产服务。使用Django为这些服务是低效的,有更多专门用于此的专门工具
相反,您应该这样做:
mysite/
manage.py
mysite/ --> (settings.py, etc)
myapp/ --> (models.py, views.py, etc)
static/
- 查找每个应用程序中的所有静态文件
- 构建一个包含所有这些内容的目录
- 将它们上载到某个位置(Web服务器上某个位置的
目录或第三方文件存储)静态
- 将您的Web服务器(如nginx)配置为直接从该目录提供
,并将任何其他请求重定向到Django/static/*
collectstatic
是一个现成的脚本,为您准备此目录,以便您可以将其直接连接到部署脚本。很好!不知道“通常通过添加MD5哈希实现”是什么意思?很好,我没有看到,我认为默认情况下没有MD5散列,因为设置。STATICFILES\u STORAGE
默认为staticfilestorage
,因此MD5只有在您将其设置为manifestStaticfilestorage
后才会启动,我说的对吗?@Mikkoohtama但是前端应用程序如何知道它应该链接到哪个文件名,因为后者总是变化?@lapin问得好!当然,需要有1)映射到最新版本,以及2)传达这一点的方式。通常它存储在某个文件中,然后当您询问“X的最新版本的完整URL”时,它会给出一个结果。您想说的是,web服务器很容易找到提供静态内容的URL