我一直在遇到这个奇怪的问题,我似乎无法找到解决方案。我无法复制并在此处完整显示我的所有代码,但我将尝试概述我的烧瓶应用程序的一般结构以展示我的问题。
(让我们忽略 / static 文件夹和我的助手模块中的所有内容)
我有3个主要观点,让他们称之为viewA,viewB和index:
viewA.html
viewB.html
index.html
viewA和viewB都显示两种形式,但内容不同(即viewA显示form1& form2,viewB也显示form1& form2)。
我的脚本代码的简化版本如下:
#imports
from flask import Flask, render_template, session, redirect, url_for, request
from flask_wtf import FlaskForm
#etc. etc.
app = Flask(__name__)
app.config['SECRET_KEY'] = 'blah blah blah'
manager = Manager(app)
bootstrap = Bootstrap(app)
moment = Moment(app)
class FormOne(FlaskForm):
sample_field = StringField('Sample Field:')
class FormTwo(FlaskForm):
other_field = StringField('Other Field:', validators=[Required()])
submit = SubmitField('Submit')
class UploadToA(FlaskForm):
content= StringField('Content to send to view A:', validators=[Required()])
submit = SubmitField('Submit')
class UploadToB(FlaskForm):
content= StringField('Content to send to view A:', validators=[Required()])
submit = SubmitField('Submit')
@app.route('/ViewA', methods=['GET', 'POST'])
def view_a():
"""
A lot of data manipulation
"""
form1 = FormOne()
form2 = FormTwo()
if request.method == 'GET':
"""
populate forms with content
"""
if request.method == 'POST':
if form2.validate_on_submit();
"""
clear session variables
"""
return redirect(url_for('index'), code=302)
return render_template('viewA.html', form1=form1, form2=form2)
@app.route('/ViewB', methods=['GET', 'POST'])
def view_b():
"""
A lot of data manipulation
"""
form1 = FormOne()
form2 = FormTwo()
if request.method == 'GET':
"""
populate forms with content
"""
if request.method == 'POST':
if form2.validate_on_submit();
"""
clear session variables
"""
return redirect(url_for('index'), code=302)
return render_template('viewB.html', form1=form1, form2=form2)
@app.route('/', methods=['GET', 'POST'])
def index():
"""
Some data manipulation
"""
formA = UploadToA()
formB = UploadToB()
if formA.validate_on_submit()':
"""
pull content from form A
create some session variables
"""
return redirect(url_for('view_a'))
if formB.validate_on_submit()':
"""
pull content from form B
create some session variables
"""
return redirect(url_for('view_b'))
return render_template('index.html', formA=formA, formB=formB)
if __name__ == '__main__':
manager.run()
现在我在这里遇到的问题是,出于某种奇怪的原因,当我在' viewA.html '我提交表单,我应该被重定向回' index.html '但由于某些奇怪的原因,它会将我重定向到' viewB.html '。此外,反之亦然:当我在' viewB.html '我提交表单,我也应该重定向回' index.html '但它会将我重定向到' viewA.html '。但是,如果我在viewA或viewB中,如果我手动将URL输入浏览器,我就不会回到索引视图。
关于为什么我可能遇到这个问题的任何想法?
提前致谢:)
答案 0 :(得分:0)
由于完整的代码不在这里,我无法确认这一点,但我认为正在发生的事情是:
if formB.validate_on_submit():
return redirect(url_for('view_b'))
这可能是发送重定向到视图B.尝试将最后一行更改为return something_else
,并查看是否在提交表单A后发送。
答案 1 :(得分:0)
我终于找到了问题的根源。事实证明,在我的' viewA.html '模板文件,我的<表格> 标签:
<form class="form form-horizontal" method="post" role="form" action="{{url_for('index')}}">
问题都在于最后一部分:
action="{{url_for('index')}}"
因此,每次我在 viewA.html 中提交 form2 时,都会为我的索引页面创建一个帖子请求,而不是的帖子请求viewA.html 页面(导致重定向到错误的视图)。因此,只需删除操作属性(操作=&#34; {{url_for(&#39;索引&#39;)}}&#34; ),我就能解决我的问题!