提交按钮混淆和请求被发送两次(使用Flask)

时间:2015-06-02 15:37:28

标签: python-2.7 flask request wtforms flask-wtforms

我正在尝试创建一个带有2个svn网址的Web应用程序,并对它们做些什么。

我的表单代码很简单,我也使用WTForms

class SVN_Path(Form):
svn_url=StringField('SVN_Path',[validators.URL()])

我尝试使用2个提交按钮创建2个表单,这些按钮分别提交2个网址,因此我的test3.html看起来像这样:

<form action="" method="post" name="SVNPath1">
        {{form1.hidden_tag()}}
        <p>
            SVN Directory:
            {{form1.svn_url(size=50)}}
            <input type="submit" value="Update">
            <br>
            {% for error in form1.svn_url.errors %}
                <span style="color: red;">[{{error}}]</span>
            {% endfor %}

        </p>
</form>

<form action="" method="post" name="SVNPath2">
            {{form2.hidden_tag()}}
            <p>
                SVN Directory:
                {{form2.svn_url(size=50)}}
                <input type="submit" value="Update">
                <br>
                {% for error in form2.svn_url.errors %}
                    <span style="color: red;">[{{error}}]</span>
                {% endfor %}
            </p>
</form>

我的第一个问题我怎么知道点击了哪个提交按钮,这样我就可以在相应的svn网址上运行正确的功能了。我尝试过像

这样的事情
if request.form1['submit'] == 'Update':
if request.form2['submit'] == 'Update':

但这根本不起作用。我是Web开发人员的常用新手,因此详细解释会有所帮助。

第二次,由于提交的内容不能正常工作,我还尝试了另外一种方法来保持我的工作,所以在我的.py文件中

 @app.route('/test3', methods=['GET','POST'])
 def test3():
    basepath=createDir()
    form1=SVN_Path()
    form2=SVN_Path()
    if request.method=="POST":
        if form1.validate_on_submit():
            svn_url = form1.svn_url.data
            prev_pdf=PDF_List(svn_url,basepath,'prev')  #some function 
        if form2.validate_on_submit():
            svn_url2 = form2.svn_url.data
            new_pdf=PDF_List(svn_url,basepath,'new')  #some function

    return render_template('test3.html', form1=form1, form2=form2)

CreateDir是一个使用当地时间的时间戳在本地/ tmp中创建目录的函数。

每当我进入网页创建一个目录时,我们称之为dir1,因为它调用了CreateDir。这就是我想要的,但当我在表单上单击提交时,它会在tmp文件夹中创建另一个目录dir2,这是 NOT 我想要的东西,因为我希望所有内容都是同一个dir1目录。

另外当我在其中一个表单中放入一个网址并点击提交时,它会自动在第二个表单中添加相同的值。

很抱歉,如果这真的很长,可能会让人感到困惑,但感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

:)让我们看看我们是否可以澄清这一点。

关于您的第一个问题:

正如@dim在评论中所说,你有几个选择:

  • 您可以将表单提交给单独的网址。这样你就知道提交了哪种表格
  • 您可以创建两个相似但不同的Form类(这些字段需要不同的名称,如prev_svn_urlcur_svn_url)。这种方式在您的视图函数中,您实例化两个不同的表单,您将知道基于form.validate_on_submit()提交的表单
  • 第三个选项是在提交按钮中添加name属性,然后将value属性更改为“更新上一个”和“更新当前”。这样在您的视图功能中,您可以检查request.data[<submit button name>]的值以确定是否按下了“更新上一个”或“更新当前”。

关于第二个问题:

正在创建多个目录,因为每次加载页面时都会调用createDir()来显示表单以及表单何时发布。为了只创建一次,在调用createDir()

之前,您需要某种逻辑来确定以前没有创建过目录。

另外:由于两个表单来自同一个SVN_Path类,因此它们以完全相同的方式读取发布数据,这就是为什么表单1中输入的内容出现在表单2中。

现在我的2美分:

我假设您正在尝试编写某种应用程序,该应用程序将两个SVN URL作为输入,创建一个文件夹并对该文件夹中的这些URL执行某些操作。如果是这种情况,那么您目前的处理方式效率低下,效果不佳。你只需要一个有2个svn_url字段的表单类(当然有不同的名字)然后在一个帖子中处理所有这些字段就可以实现这一点。

编辑:提交按钮的作用是告诉浏览器您已准备好将表单上的数据发送到服务器。在这种情况下,您只需要一个提交按钮(SubmitFiled =&gt;呈现时)。单击该提交按钮将从两个输入字段向您的视图功能发送数据。

您的表单应如下所示:

class SVN_Path(Form):
    prev_svn_url=StringField('Previous SVN_Path',[validators.URL()])
    new_svn_url=StringField('New SVN_Path',[validators.URL()])

和您的查看功能:

def test():
form = SVN_Path()
if request.method == "POST":
    if form.validate_on_submit():
        basepath = createDir() # Only create dir when everything validates
        prev_svn_url = form.prev_svn_url.data
        new_svn_url = form.new_svn_url.data
        prev_pdf = PDF_List(prev_svn_url, basepath, 'prev') 
        new_pdf = PDF_List(new_svn_url, basepath, 'new')
        ...

return render_template('test3.html', form1=form1, form2=form2)