import gradio as gr import os import shutil from pathlib import Path from huggingface_hub import HfApi, hf_hub_download # --- 持久化类 (直接嵌入以便于 Demo 运行) --- class PersistenceManager: def __init__(self, dataset_id, token=None): self.api = HfApi(token=token or os.environ.get("HF_TOKEN")) self.dataset_id = dataset_id def restore(self, remote_path, local_path): try: downloaded_path = hf_hub_download( repo_id=self.dataset_id, repo_type="dataset", filename=remote_path, token=os.environ.get("HF_TOKEN") ) shutil.copy(downloaded_path, local_path) return True except Exception: return False def save(self, local_path, remote_path): try: self.api.upload_file( path_or_fileobj=local_path, path_in_repo=remote_path, repo_id=self.dataset_id, repo_type="dataset", token=os.environ.get("HF_TOKEN") ) return True except Exception: return False # --- App 逻辑 --- DATASET_ID = os.environ.get("DATASET_REPO_ID", "mingyang22/persistent-storage") DB_FILE = "counter.txt" REMOTE_PATH = "backups/counter.txt" pm = PersistenceManager(DATASET_ID) # 初始化:尝试恢复 pm.restore(REMOTE_PATH, DB_FILE) def get_count(): if os.path.exists(DB_FILE): with open(DB_FILE, "r") as f: return f.read().strip() return "0" def increment(): current = int(get_count()) new_count = current + 1 with open(DB_FILE, "w") as f: f.write(str(new_count)) # 异步备份 (为了快,这里同步写,但在生产中可以放到后台) success = pm.save(DB_FILE, REMOTE_PATH) status = "✅ 备份成功" if success else "❌ 备份失败 (请确认 Secret 配置)" return str(new_count), status with gr.Blocks() as demo: gr.Markdown("# 🚀 HuggingFace 持久化 Demo") gr.Markdown("这个 Space 在重启后会通过 Dataset 恢复之前的计数状态。") with gr.Row(): counter_display = gr.Label(value=get_count(), label="当前计数值") status_display = gr.Textbox(label="云端同步状态") btn = gr.Button("累加并存档 (Increment & Save)") btn.click(fn=increment, outputs=[counter_display, status_display]) gr.Markdown("### 如何验证?") gr.Markdown("1. 点击按钮累加数字。\n2. 在管理脚本中执行 `restart` 命令重启这个 Space。\n3. 刷新页面,你会发现计数值没有归零,而是从上次保存的地方继续!") demo.launch()