Flask多请求处理:仓库不存在时需先显示提示静态页
问题描述
我正在开发一个Flask应用,功能是通过HTML表单接收仓库名称和邮箱,实现仅当GitHub仓库不存在时才创建的逻辑。目前已经完成仓库存在性检查和创建功能,但卡在了流程控制上:当仓库不存在时,我想先在浏览器显示静态提示页(内容为“GitHub仓库不存在,正在创建新仓库”),之后再自动执行仓库创建逻辑,但现在无法实现这个流程——check_repo路由检查到仓库不存在后,没法先跳转到提示页,再进入create_repo路由执行创建操作。
现有Flask代码
"""Flask app to create github repo""" import os import requests from flask import Flask, request, render_template, redirect, url_for from requests.auth import HTTPBasicAuth app = Flask(__name__) @app.route('/') def index(): """Get html template""" return render_template('create_repo.html') @app.route('/check_repo', methods=['POST']) def repo_exists(): """Function to check if git repo exists""" repo_name = request.form.get('Application_Name') """Code to check if repo exists""" response = requests.get(**params) if response.status_code == 200: return render_template('repo_exists.html') return redirect(url_for('create_repo')) @app.route('/create_repo', methods=['POST']) def create_repo(): """Creates a repo""" application_name = request.form.get('Application_Name') return render_template('repo_not_found.html', repo_name=application_name) #"""Create repo code""" #return redirect(url_for('repo_created')) --> Not sure how to call final message from here after a return above @app.route('/repo_created') def repo_created(): """Prints repo created message""" return "Repository Created Successfully!" if __name__ == '__main__': app.run(debug=True)
现有create_repo.html代码
{% extends 'base.html' %} {% block content %} <h1>{% block title %} GitHub Repo Automation {% endblock %}</h1> <form action="/check_repo" method="POST" onsubmit="showLoadingMessage()"> <div class="form-group"> <label for="Application_Name">Application Name</label> <input type="text" name="Application_Name" placeholder="GitHub Repo/App Name" class="form-control" value="{{ request.form['Application_Name'] }}"></input> </div> <div class="form-group"> <label for="Owner_Email">Owner Email</label> <input type="text" name="Owner_Email" placeholder="Email Address" class="form-control" value="{{ request.form['Owner_Email'] }}" type="email"></input> </div> <div class="form-group"> <button type="submit" class="btn btn-primary">Submit</button> </div> <div id="loading" style="display: none;">Checking if Git Repository Exists...</div> <script>function showLoadingMessage(){ document.getElementById('loading').style.display = 'block' }</script> <style> #loading { color: #007bff; } h1 { border: 2px #eee solid; color: brown; text-align: center; padding: 10px; } </style> </form> {% endblock %}
解决方案及修改后的代码
核心思路:利用session存储表单数据,在提示页通过前端JS自动触发创建请求,实现“显示提示→自动执行创建→跳转成功页”的流程。
1. 修改后的Flask代码
"""Flask app to create github repo""" import os import requests from flask import Flask, request, render_template, redirect, url_for, session from requests.auth import HTTPBasicAuth app = Flask(__name__) app.secret_key = 'your-custom-secret-key-here' # 必须设置才能使用session @app.route('/') def index(): return render_template('create_repo.html') @app.route('/check_repo', methods=['POST']) def repo_exists(): repo_name = request.form.get('Application_Name') owner_email = request.form.get('Owner_Email') # 把表单数据存入session,供后续创建路由使用 session['repo_name'] = repo_name session['owner_email'] = owner_email # 替换为你的真实GitHub仓库检查逻辑 # params = { # 'url': f'https://api.github.com/repos/{your-username}/{repo_name}', # 'auth': HTTPBasicAuth(your-username, your-token) # } # response = requests.get(**params) # 模拟仓库不存在的情况(实际代码删除此行) response = type('obj', (object,), {'status_code': 404})() if response.status_code == 200: return render_template('repo_exists.html') # 渲染提示页,而非直接跳转创建路由 return render_template('repo_not_found.html', repo_name=repo_name) @app.route('/create_repo', methods=['POST']) def create_repo(): repo_name = session.get('repo_name') owner_email = session.get('owner_email') if not repo_name: return redirect(url_for('index')) # 替换为你的真实GitHub仓库创建逻辑 # create_params = { # 'url': 'https://api.github.com/user/repos', # 'auth': HTTPBasicAuth(your-username, your-token), # 'json': {'name': repo_name, 'private': False} # } # requests.post(**create_params) # 创建完成后跳转成功页 return redirect(url_for('repo_created')) @app.route('/repo_created') def repo_created(): repo_name = session.get('repo_name') # 清除session临时数据 session.pop('repo_name', None) session.pop('owner_email', None) return f"仓库 {repo_name} 创建成功!" if __name__ == '__main__': app.run(debug=True)
2. 修改后的repo_not_found.html模板
{% extends 'base.html' %} {% block content %} <h1>{% block title %} 创建仓库中 {% endblock %}</h1> <p>GitHub仓库 "{{ repo_name }}" 不存在,正在创建新仓库...</p> <script> // 页面加载完成后自动触发创建请求 window.onload = function() { fetch('/create_repo', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' // 若启用CSRF保护,需添加:'X-CSRFToken': '{{ csrf_token() }}' } }).then(res => { if (res.ok) { window.location.href = '/repo_created'; } else { alert('仓库创建失败,请重试'); window.location.href = '/'; } }).catch(err => { alert('请求出错,请重试'); window.location.href = '/'; }); }; </script> {% endblock %}
内容的提问来源于stack exchange,提问作者gra89-stack
相关产品推荐
相关产品推荐

