【flask框架学习】解决Flask框架浏览器默认会记录最后一次请求,即2次发送POST请求问题

问题

进行在调用POST请求是发现刷新页面会执行上一次的POST请求,这样很不爽,但是对应新手小白来说,这个常识自己又不知道,因此询问deepseek,完美解决。
在这里插入图片描述

问题分析

你的代码逻辑中,当用户提交 POST 请求时,直接返回了渲染后的模板 ai_generated_image_demo.html:

if request.method == 'POST':
    return render_template('ai_generated_image_demo.html', ...)

这导致浏览器将最后一次请求记录为 POST,刷新时会 重新提交相同的 POST 请求,触发重复生成。

解决方案:使用 Post/Redirect/Get (PRG) 模式

通过 重定向到 GET 请求 来分离表单提交(POST)和结果展示(GET),确保刷新页面时不会重复提交。

修改后的代码

from flask import Flask, request, redirect, url_for, session, render_template
from flask_login import current_user  # 假设你用了 Flask-Login

@app.route('/AI_generated_image', methods=['GET', 'POST'])
def AI_generated_image():
    # 登录检查
    if not current_user.is_authenticated:
        return redirect(url_for('login_in', next=request.url))

    if request.method == 'POST':
        try:
            # 执行生成图像的逻辑(替换为你的实际代码)
            image_path = generate_image()  # 假设这是生成图像的函数

            # 将生成的图像路径暂存到 Session
            session['generated_image_path'] = image_path

            # 重定向到 GET 请求,避免刷新重复提交
            return redirect(url_for('show_generated_image'))

        except Exception as e:
            # 处理错误
            return str(e)

    # GET 请求时,渲染页面(首次访问或刷新后)
    return render_template(
        'ai_generated_image_demo.html',
        examples=examples,
        my_images=my_images,
        models=app.config['MODELS'],
        image_path=session.get('generated_image_path'),  # 从 Session 中读取
        system_prompt="请输入您的提示词..."
    )

@app.route('/generated_result')
def show_generated_image():
    # 安全校验(可选)
    if 'generated_image_path' not in session:
        return redirect(url_for('AI_generated_image'))
    
    # 直接渲染模板(GET 请求专用路由)
    return render_template(
        'ai_generated_image_demo.html',
        examples=examples,
        my_images=my_images,
        models=app.config['MODELS'],
        image_path=session.get('generated_image_path'),
        system_prompt="请输入您的提示词..."
    )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值