Python开发阶段后台管理系统,如何检测JS内容变动并自动修改文件名?
flask--> 使用者不知清缓存,会导致页面部分数据不正确或者没有
解决方法一: 改变静态文件名称,与上次名字不一致。缺点:有时候开发者会忘记,操作麻烦,让开发者精力集中在业务上。
方法二: 听说有个 gulp 可以管理静态文件,具体教程各位大佬有?
方法三(主要想要这种方法): 有 python 或者 flask 相关的包,来管理这些静态文件?
Python开发阶段后台管理系统,如何检测JS内容变动并自动修改文件名?
我看到别人 JavaScript 的 scr 后面带了?版本号。
比如现在这个页面,你查看源代码就可以看到;
<script src="/static/dist/combo.js?v=c60a80c85dcdff5b64f7ce14139b2435" type=“text/javascript” defer></script>
这个问题在Web开发中很常见,主要是为了实现前端静态资源的版本化管理,避免浏览器缓存导致更新后用户看不到最新代码。
核心思路是:在构建阶段,通过计算JS文件的哈希值(如MD5或SHA-256)并将其附加到文件名中,同时自动更新HTML模板中的引用路径。
这里提供一个基于Python的简单实现方案,使用hashlib计算文件哈希,并结合os和re模块进行文件操作和内容替换。
import hashlib
import os
import re
import glob
def generate_file_hash(filepath):
"""计算文件的MD5哈希值(取前8位)"""
hash_md5 = hashlib.md5()
with open(filepath, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
hash_md5.update(chunk)
return hash_md5.hexdigest()[:8]
def update_js_references(html_file, js_mapping):
"""更新HTML文件中的JS引用"""
with open(html_file, 'r', encoding='utf-8') as f:
content = f.read()
for old_name, new_name in js_mapping.items():
# 使用正则匹配替换script标签中的src属性
pattern = rf'src=["\'](.*?{re.escape(old_name)})["\']'
replacement = f'src="static/js/{new_name}"'
content = re.sub(pattern, replacement, content)
with open(html_file, 'w', encoding='utf-8') as f:
f.write(content)
def main():
# 配置路径
js_dir = "static/js"
html_file = "templates/index.html"
# 获取所有JS文件
js_files = glob.glob(os.path.join(js_dir, "*.js"))
js_mapping = {}
for js_file in js_files:
# 计算哈希并生成新文件名
file_hash = generate_file_hash(js_file)
base_name = os.path.basename(js_file)
name_without_ext, ext = os.path.splitext(base_name)
new_name = f"{name_without_ext}.{file_hash}{ext}"
# 重命名文件
new_path = os.path.join(js_dir, new_name)
os.rename(js_file, new_path)
js_mapping[base_name] = new_name
print(f"Renamed: {base_name} -> {new_name}")
# 更新HTML引用
if js_mapping:
update_js_references(html_file, js_mapping)
print("Updated HTML references")
if __name__ == "__main__":
main()
关键点说明:
- 哈希生成:
generate_file_hash函数计算JS文件的MD5哈希,取前8位足够区分不同版本。 - 文件重命名:将原文件名改为
原文件名.哈希值.js的格式。 - 引用更新:
update_js_references函数使用正则表达式匹配HTML中对应的<script>标签,并替换src属性。
使用方式:
- 将上述代码保存为
version_assets.py - 根据实际情况修改
js_dir和html_file路径 - 在构建或部署脚本中运行此脚本
生产环境建议: 虽然这个方案能解决问题,但在实际项目中,更推荐使用成熟的构建工具:
- Webpack:配合
output.filename的[contenthash]占位符 - Vite:内置资源哈希处理
- Django-Compressor或Flask-Assets:专门的静态资源管理扩展
这些工具提供了更完善的功能,如依赖分析、代码压缩、缓存失效等。
一句话总结:用文件哈希重命名JS并同步更新HTML引用,但建议直接用Webpack等成熟构建工具。
js 后面拼时间戳参数就行了
webpack 啊
所以开发阶段为什么会有使用者?
你们没用 webpack ?
如果没有用 webpack 可以直接在后面添加时间戳 那每次加载 js 都是最新的 获取找找其他的类似 JSLoader 之类的工具
是供公司内部使用的,运营边使用边提出需求
没有用过
那岂不是我说的第一种方法,这种方法不好操作,太繁琐,想一劳永逸
webpack 了解一下
有 python 相关的包?
webpack 和 gulp 都行,原理就是自动帮你改静态文件名。
网上资料大把,但是相关具体操作文档难找,请问您有相关资料?
gulp 也行
mc 牛逼
请求后面都带随机数,每次都强刷好了
js url 加一个时间戳参数就可以了,作用是每次都会请求最新的 js 文件。
例如: 1.js?timestamp=2123122232323
地址后加 search 串可穿透缓存
<script src="/static/dist/combo.js?v=c60a80c85dcdff5b64f7ce14139b2435" type=“text/javascript” defer></script> 这样?就是问号后面随意写?
直接加随机字符串时间戳也可以
随便写就算你在?后面写个小说应该都没问题。[doge]
webpack 是个工具 不是包
只是内部用,你搞个时间戳就行了,没必要搞那么麻烦,解决问题不需要 1 分钟
不写的话,你的 js 文件被缓存到本地了,就不会重新加载了
写了以后,你的 js 文件每次都不一样,都会重新加载
webpack 自动加
叫他 刷新用 ctrl+f5
webpack 在你电脑打开以后,如果在局域网可以访问你的 ip,
如果不在一个局域网, 可以用内网穿透,不过没有必要
自己找个地方搭建个上传不就可以了, 告诉他这个就是开发环境
用 nginx 代理一下,设置 expires = -1 表示浏览器不缓存即可。
webpack 咋设置?各位大佬
ctrl+F5 能实现的事非得搞出点其他东西。。。路径后面加时间戳也能实现的东西非得搞出点其他东西。。。webpack 和 gulp 都能实现的东西,百度搜一下就知道了,人家都回复你了,还得问具体咋设置
abc.js => abc-flsadjfasldkfjaslkdjfads.js
加上一串奇怪的 hash 就行了。
基本上 webpack gulp 这些东西 build 时候都可以给你加上一串 hash 的。
然后 你需要做的就是在 前端页面 动态的修改 script 标签里面的 引用。


