django:如何加载 hash/md5 正确附加的静态文件?
django: how to load the static files with hash/md5 appending correctly?
使用 Django 3
我关注了 Django 文档
https://docs.djangoproject.com/en/3.0/ref/contrib/staticfiles/#manifeststaticfilesstorage
导出带有哈希附加的静态文件。
settings.py production
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
static_root folder (output)
static_root/
staticfiles.json
static_root/css/
project_styles.87c2920e7bc3.css
project_styles.css
一切都正确收集。
之后我将所有内容上传到我的 apache 静态服务器。
然后我开始/评论 STATICFILES_STORAGE
。这就是我对医生的理解?如果我在生产中保留此设置,我会得到 500 Error
.
settings.py production
# STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
在生产环境中重新启动我的 Django 应用程序后,我的站点仍在加载 project_styles.css
但不是浏览器中的散列版本 project_styles.87c2920e7bc3.css
。即使我删除 project_styles.css
Django 也不会提供散列版本。
问题
我是否遗漏了生产模式 settings.py
中的某些设置?
在文档中,他们提到设置 STATICFILES_STORAGE = django.contrib.staticfiles.storage.StaticFilesStorage
但它没有显示任何区别。正如所提到的,它仅用于测试。
我必须做什么才能在生产中加载正确的静态散列版本?我是否必须在我的模板中设置一些东西,以便 django 将查看 json 文件以获得正确的哈希版本?或者我必须命名哈希文件吗?
好吧,问题是我想要两条不同的 STATIC_ROOT 路径。一个用于开发,一个用于生产,因为我希望我所有的开发内容都放在一个项目文件夹中。因为如果你 collectstatic
使用你的 apache 服务器的 STATIC_ROOT,django 会将它导出到 c:/var/www/your/server/static
,而我想要它到 c:/webprojects/myproject_1/static_root_exports
,然后将这些文件上传到我的服务器分开。
所以我根据 DEV_STATIC
在我的 django-environ 文件中关闭/打开设置了两个不同的路径。 Django 将设置正确的路径。
.env
DEBUG=off
# --- applies media server & sets MEDIA_ROOT & STATIC_ROOT
DEV_STATIC=on
<...>
STATIC_ROOT_DEV=static_root_exports
STATIC_ROOT_PROD=/var/www/myUserName/html/myproject_assets/static
<...>
setting.py
# -- Set for Hash
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
# --- STATIC_ROOT
if DEV_STATIC == True:
STATIC_ROOT = SERVER_DIR.joinpath(env('STATIC_ROOT_DEV'))
else:
STATIC_ROOT = env('STATIC_ROOT_PROD')
使用 Django 3
我关注了 Django 文档 https://docs.djangoproject.com/en/3.0/ref/contrib/staticfiles/#manifeststaticfilesstorage 导出带有哈希附加的静态文件。
settings.py production
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
static_root folder (output)
static_root/
staticfiles.json
static_root/css/
project_styles.87c2920e7bc3.css
project_styles.css
一切都正确收集。
之后我将所有内容上传到我的 apache 静态服务器。
然后我开始/评论 STATICFILES_STORAGE
。这就是我对医生的理解?如果我在生产中保留此设置,我会得到 500 Error
.
settings.py production
# STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
在生产环境中重新启动我的 Django 应用程序后,我的站点仍在加载 project_styles.css
但不是浏览器中的散列版本 project_styles.87c2920e7bc3.css
。即使我删除 project_styles.css
Django 也不会提供散列版本。
问题
我是否遗漏了生产模式 settings.py
中的某些设置?
在文档中,他们提到设置 STATICFILES_STORAGE = django.contrib.staticfiles.storage.StaticFilesStorage
但它没有显示任何区别。正如所提到的,它仅用于测试。
我必须做什么才能在生产中加载正确的静态散列版本?我是否必须在我的模板中设置一些东西,以便 django 将查看 json 文件以获得正确的哈希版本?或者我必须命名哈希文件吗?
好吧,问题是我想要两条不同的 STATIC_ROOT 路径。一个用于开发,一个用于生产,因为我希望我所有的开发内容都放在一个项目文件夹中。因为如果你 collectstatic
使用你的 apache 服务器的 STATIC_ROOT,django 会将它导出到 c:/var/www/your/server/static
,而我想要它到 c:/webprojects/myproject_1/static_root_exports
,然后将这些文件上传到我的服务器分开。
所以我根据 DEV_STATIC
在我的 django-environ 文件中关闭/打开设置了两个不同的路径。 Django 将设置正确的路径。
.env
DEBUG=off
# --- applies media server & sets MEDIA_ROOT & STATIC_ROOT
DEV_STATIC=on
<...>
STATIC_ROOT_DEV=static_root_exports
STATIC_ROOT_PROD=/var/www/myUserName/html/myproject_assets/static
<...>
setting.py
# -- Set for Hash
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
# --- STATIC_ROOT
if DEV_STATIC == True:
STATIC_ROOT = SERVER_DIR.joinpath(env('STATIC_ROOT_DEV'))
else:
STATIC_ROOT = env('STATIC_ROOT_PROD')