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

Flask应用中url_for函数无法实现跳转问题求助

Flask表单提交后重定向失效问题排查

我在Flask项目中使用flask_smorest构建应用,原本期望表单提交后通过url_for重定向到thankyou路由,但跳转未生效。手动访问/temp和/thankyou路由均能正常打开对应页面,所有模板均已就绪,推测是入门级错误,附上项目代码请求协助排查:

app.py 代码

from flask import Flask
from flask_smorest import Api
from db import db
from routes import blp as RoutesBlueprint


def create_app():
    app = Flask(__name__)
    app.config["API_TITLE"] = "URL Shortner"
    app.config['SECRET_KEY'] = 'key'
    app.config["API_VERSION"] = "v1"
    app.config["OPENAPI_VERSION"] = "3.0.3"
    app.config["OPENAPI_URL_PREFIX"] = "/"
    app.config["OPENAPI_SWAGGER_UI_PATH"] = "/swagger-ui"
    app.config[
        "OPENAPI_SWAGGER_UI_URL"
    ] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"
    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///data.db"

    #db.init_app(app)
    api = Api(app)
    #with app.app_context():
    #    db.create_all()

    api.register_blueprint(RoutesBlueprint)

    return app

路由文件代码

from flask_smorest import Blueprint
from flask import render_template, session, redirect, url_for
from basic import InfoForm

blp = Blueprint("Routes", __name__, description="The routes of the app")

@blp.route('/', methods = ['GET','POST'])
def index():
    form = InfoForm()
    if form.validate_on_submit():
        session['breed'] = form.breed.data
        session['neutered'] = form.neutered.data
        session['mood'] = form.mood.data
        session['food_choice'] = form.food_choice.data
        session['feedback'] = form.feedback.data

        return redirect(url_for('temp'))
    
    return render_template('index.html', form = form)

@blp.route('/thankyou')
def thankyou():
    return render_template ('thankyou.html')

@blp.route('/temp')
def temp():
    return render_template('temp.html')

FlaskForm类代码

from flask_wtf import FlaskForm, Form 
from wtforms import (StringField, SubmitField, RadioField, 
                     TextAreaField, BooleanField,
                     DateTimeField, SelectField)
from wtforms.validators import DataRequired
class InfoForm(FlaskForm):
    breed = StringField("What Breed? ", validators=[DataRequired()])
    neutered = BooleanField("Neutered?")
    mood = RadioField('Choose: ', 
                      choices=[("mood_one", 'Happy'), ('mood_two', 'excited')])
    food_choice = SelectField("choose: ", 
                              choices=[('chi',"Chicken"), ('bf','Beef'), ('fish', 'Fish')])
    feedback = TextAreaField("Feedback", default= 'Type in any feedback')
    submit = SubmitField("Submit")

表单模板代码

<form>
    {{form.hidden_tag}}
    {{form.breed.label}}
    {{form.breed}}
    <br>
    {{form.neutered.label}}
    {{form.neutered}}
    <br>
    {{form.food_choice.label}}
    {{form.food_choice}}
    <br>
    {{form.mood.label}}
    {{form.mood}}
    <br>
    {{form.feedback.label}}
    {{form.feedback}}
    <br>
    {{form.submit}}
    <br>
</form>

问题原因及解决方法:

  • 表单未指定POST方法:模板中的<form>标签默认使用GET方法,无法触发表单验证逻辑。修改为<form method="POST">。
  • CSRF令牌渲染错误:{{form.hidden_tag}}需改为{{form.hidden_tag()}},这是一个方法调用,必须加括号才能生成CSRF令牌字段,否则验证会失败。
  • 蓝图路由端点名称错误:flask_smorest的蓝图路由端点格式为蓝图名称.视图函数名,所以url_for('temp')要改成url_for('Routes.temp'),确保能正确找到路由。

内容的提问来源于stack exchange,提问作者polkamonster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:28:13