You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:43:18