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
相关产品推荐
相关产品推荐

