
本文介绍如何在 flask 应用中优雅处理“检查 → 提示 → 创建”三阶段 github 仓库操作,通过新增中间路由与模板,避免逻辑耦合,确保用户获得清晰的异步式反馈体验。
本文介绍如何在 flask 应用中优雅处理“检查 → 提示 → 创建”三阶段 github 仓库操作,通过新增中间路由与模板,避免逻辑耦合,确保用户获得清晰的异步式反馈体验。
在 Flask 中实现带中间状态提示的多步操作(如“检查仓库是否存在 → 显示创建提示 → 执行创建”),关键在于解耦控制流与视图渲染,而非依赖单次重定向链或在函数内混用 return 语句。原代码中 /check_repo 直接 redirect(url_for('create_repo')) 会跳过提示页,而 create_repo() 视图又未接收必要参数,导致流程断裂。
✅ 正确实现方案:三段式路由 + 静态提示页
首先,新增一个专用路由 /repo_does_not_exist,用于响应“仓库不存在”场景,并渲染静态提示模板:
@app.route('/repo_does_not_exist', methods=['GET'])
def repo_does_not_exist():
# 从 session 或 query string 获取 repo_name(推荐通过 GET 传递)
repo_name = request.args.get('repo_name', 'unknown')
return render_template('repo_does_not_exist.html', repo_name=repo_name)
注意:此处使用 methods=['GET'] 更合理——因为该页面是重定向目标,不应再接收表单 POST 数据;repo_name 通过 URL 参数传入(见下方重定向写法)。
接着,修正 /check_repo 的逻辑:当仓库不存在时,携带参数重定向至提示页:
@app.route('/check_repo', methods=['POST'])
def repo_exists():
repo_name = request.form.get('Application_Name')
owner_email = request.form.get('Owner_Email') # 如需后续使用,可存入 session
# 构造 GitHub API 请求(示例)
params = {
'url': f'https://api.github.com/repos/{owner_email}/{repo_name}',
'auth': HTTPBasicAuth('your_username', 'your_token'),
'headers': {'Accept': 'application/vnd.github.v3+json'}
}
try:
response = requests.get(params['url'], auth=params['auth'], headers=params['headers'])
if response.status_code == 200:
return render_template('repo_exists.html', repo_name=repo_name)
else:
# 重定向到提示页,并附带 repo_name 参数
return redirect(url_for('repo_does_not_exist', repo_name=repo_name))
except requests.RequestException as e:
return render_template('error.html', message=f"API check failed: {e}")
? 创建提示模板 repo_does_not_exist.html
该模板需包含友好提示 + 自动跳转逻辑(无需用户点击):
引导 OpenClaw 代理使用 exec 和 process 工具执行 Ralph Wiggum 循环。通过 pty:true 提供正确的 TTY 支持,编排编码代理(Codex, Claude Code, OpenCode, Goose)。利用 PROMPT.md、AGENTS.md、SPECS 和 IMPLEMENTATION_PLAN.md 规划和构建代码。包含规划与构建模式、背压机制、沙箱及完成条件。用户请求循环,代理使用工具执行。
<!-- templates/repo_does_not_exist.html -->
{% extends 'base.html' %}
{% block content %}
<div class="alert alert-info text-center">
<h3>GitHub 仓库 "{{ repo_name }}" 不存在</h3>
<p>正在为您创建新仓库...</p>
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<script>
// 2秒后自动跳转至创建页
setTimeout(() => {
window.location.href = "{{ url_for('create_repo') }}?repo_name={{ repo_name }}";
}, 2000);
</script>
{% endblock %}
? 提示:使用 setTimeout 实现静默跳转,比 更可控;同时将 repo_name 作为查询参数传给 /create_repo,确保创建逻辑能获取上下文。
?️ 更新 /create_repo 路由以接收参数
@app.route('/create_repo', methods=['GET', 'POST'])
def create_repo():
# 支持 GET(来自提示页跳转)和 POST(实际提交创建请求)
if request.method == 'GET':
repo_name = request.args.get('repo_name', '')
return render_template('create_repo_confirm.html', repo_name=repo_name)
# POST 处理:执行 GitHub API 创建逻辑
repo_name = request.form.get('Application_Name')
owner_email = request.form.get('Owner_Email')
# ⚠️ 注意:此处应调用 GitHub API 创建仓库(略去具体实现)
# create_github_repo(repo_name, owner_email)
return render_template('repo_created.html', repo_name=repo_name)
配套模板 create_repo_confirm.html 可显示确认表单或直接触发后台创建(如用 AJAX);最终成功页 repo_created.html 展示结果。
✅ 关键注意事项
- 避免重定向循环:确保所有路由 url_for() 引用准确,且模板中 action 属性指向正确端点。
- 参数传递安全:敏感信息(如 token)切勿暴露在 URL 或模板中;repo_name 等非敏感字段可安全传递。
- 错误防御:对 requests.get() 添加异常捕获,防止网络失败导致 500 错误。
- 用户体验优化:提示页建议加入加载动画与倒计时文案,提升感知流畅度。
通过以上结构化设计,Flask 应用即可清晰分离“检查→提示→创建”各阶段职责,兼顾可维护性与用户友好性。










