Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当重定向到索引时,Flask重定向到错误的视图_Python_Flask - Fatal编程技术网

Python 当重定向到索引时,Flask重定向到错误的视图

Python 当重定向到索引时,Flask重定向到错误的视图,python,flask,Python,Flask,我一直遇到这个奇怪的问题,似乎无法找到解决办法。我无法在这里完整地复制和显示我的所有代码,但我将尝试概述我的flask应用程序的总体结构,以展示我的问题 (让我们忽略/static文件夹和my helper模块中的所有内容) 我有3个主要视图,我们称它们为viewA、viewB和index: viewA.html viewB.html index.html viewA和viewB都显示两个表单,但内容不同(即viewA显示form1和form2,viewB也显示form1和form2) 我的脚

我一直遇到这个奇怪的问题,似乎无法找到解决办法。我无法在这里完整地复制和显示我的所有代码,但我将尝试概述我的flask应用程序的总体结构,以展示我的问题

(让我们忽略/static文件夹和my helper模块中的所有内容)

我有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,我就不会返回索引视图

你知道我为什么会遇到这个问题吗


提前感谢:)

因为这里没有完整的代码,我不能确定这一点,但我认为发生的是:

  • 你打开表格A
  • 你提交表格A
  • 它向/index发送重定向
  • 它将重定向到/FormB

  • 这可能是向视图B发送重定向。请尝试将最后一行更改为类似“返回其他内容”,并查看它在提交表单a后是否发送该内容。

    我终于找到了问题的根源。事实证明,在我的“viewA.html”模板文件中,我的
    标记中有以下内容:


    因此,每次我在viewA.html中提交form2时,它都会为我的索引页创建一个post请求,而不是为viewA.html页创建一个post请求(这导致重定向到错误的视图)。因此,通过简单地删除action属性(action=“{url\u for('index')}”),我就能够解决我的问题了

    谢谢你的回复!是的,您对流程的想法是正确的,但我不明白的是,为什么在步骤3和步骤4之间,它会自动向/FormB发送重定向?i、 e:1。我在viewA中,我在/viewA 2中提交表格2。我应该被重定向到/index(但我会立即被重定向到/viewB,而不必首先在index视图中点击表单B的提交按钮)-这就是我似乎不明白的原因?至于第二部分,即使我将重定向更改为:“if formB.validate_on_submit():return redirect(url_for('different_view'))”,我也会得到issue@DGav输入
    /index
    后,
    formB.validate_on_submit()
    将导致
    True
    ,从而使其重定向。我想。否则我看不出这是怎么回事possible@HyperNeautrino你说得对。我在上面编辑了我的评论,以便更彻底地解释,但是如果我没有机会在重定向到/index后提交该表单,为什么它会立即评估为真?这就像是自动为我提交……更新:实际上,当我在viewA.html和submitform2中时,它会将我重定向到viewB.html而不是index.html。然而,当我在viewB.html中提交form2时,没有问题,它会将我重定向到index.html。
    if formB.validate_on_submit():
        return redirect(url_for('view_b'))
    
    <form class="form form-horizontal" method="post" role="form" action="{{url_for('index')}}">
    
    action="{{url_for('index')}}"