重定向到索引

时间:2017-11-02 19:35:39

标签: python flask

我一直在遇到这个奇怪的问题,我似乎无法找到解决方案。我无法复制并在此处完整显示我的所有代码,但我将尝试概述我的烧瓶应用程序的一般结构以展示我的问题。

(让我们忽略 / 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输入浏览器,我就不会回到索引视图。

关于为什么我可能遇到这个问题的任何想法?

提前致谢:)

2 个答案:

答案 0 :(得分:0)

由于完整的代码不在这里,我无法确认这一点,但我认为正在发生的事情是:

  1. 您打开表格A
  2. 您提交表格A
  3. 它将重定向发送到/ index
  4. 它将重定向发送到/ FormB
  5. 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; ),我就能解决我的问题!