如何在PyScript中将特定文件持久化到localStorage以避免页面刷新后数据重置?
如何在PyScript中将特定文件持久化到localStorage以避免页面刷新后数据重置?
我太懂这种烦恼了——PyScript默认用的是Pyodide的内存文件系统,页面一刷新,所有临时文件直接清空,之前改的oauth.json自然就没了!要让这个文件能在刷新后依然保留,我们可以通过把文件内容和浏览器的localStorage双向同步来解决,而且还能让你的依赖库照常使用文件读写逻辑,不用改太多代码。
核心思路
Pyodide的文件系统存在内存里,刷新就消失,但浏览器的localStorage是持久化存在用户本地的。我们要做的就是:
- 页面加载时,先从localStorage把保存的
oauth.json内容读出来,写入Pyodide的文件系统; - 每次修改文件后,再把最新的内容同步回localStorage,确保下次刷新能拿到最新数据。
修改后的完整代码
结合你现有的代码,我调整了一下,加上了同步逻辑:
from pyscript import document, window from os import path, getcwd import json # 配置需要持久化的文件和localStorage的标识键 TARGET_FILE = "./oauth.json" # 如果你要操作/home/pyodide/oauth.json,直接改这里就行 STORAGE_KEY = "pyscript_oauth_json" # 用独特的键避免和其他localStorage数据冲突 def sync_to_local_storage(content): """把文件内容同步到浏览器localStorage""" window.localStorage.setItem(STORAGE_KEY, content) def sync_from_local_storage(): """从localStorage恢复内容到Pyodide文件系统""" saved_content = window.localStorage.getItem(STORAGE_KEY) if saved_content: # 如果localStorage有保存的数据,写入文件 with open(TARGET_FILE, "w", newline="\n", encoding="utf-8") as f: f.write(saved_content) print("已从localStorage恢复oauth.json内容") else: # 没有保存的数据,创建空文件并同步到localStorage empty_content = "{}" with open(TARGET_FILE, "w", newline="\n", encoding="utf-8") as f: f.write(empty_content) sync_to_local_storage(empty_content) print("创建新的oauth.json并同步到localStorage") # 页面加载时先执行恢复逻辑 sync_from_local_storage() # 示例:如果需要修改文件内容,记得同步到localStorage def update_oauth_data(new_data): # 写入文件系统 with open(TARGET_FILE, "w", newline="\n", encoding="utf-8") as f: json.dump(new_data, f, indent=2) # 同步到localStorage with open(TARGET_FILE, "r", encoding="utf-8") as f: latest_content = f.read() sync_to_local_storage(latest_content) print("oauth.json已更新并同步到localStorage") # 测试用例(可以注释掉) # update_oauth_data({"access_token": "abc123", "expires_in": 3600})
关键细节说明
- 路径适配:如果你要操作的是
/home/pyodide/oauth.json,只需要把TARGET_FILE的值改成这个绝对路径就行,Pyodide完全支持。 - 同步时机:如果你的依赖库会自动修改这个文件,那你需要在库完成写入后手动调用
sync_to_local_storage;如果是你自己的代码修改文件,就在写入后同步就行。 - 存储限制:localStorage的容量一般在5MB左右,所以这个方法适合小文件(比如你的oauth配置文件完全没问题),大文件不建议用这个方式。
备注:内容来源于stack exchange,提问作者user24521401
相关产品推荐
相关产品推荐

