提交按钮混淆和请求被发送两次(使用 Flask)
Submit Button Confusion and Request being sent Twice (Using Flask)
我非常想创建一个需要 2 个 svn urls 并用它们做一些事情的网络应用程序。
我的表单代码很简单,我也在用WTForms
class SVN_Path(Form):
svn_url=StringField('SVN_Path',[validators.URL()])
我正在尝试创建 2 个带有 2 个提交按钮的表单,这些按钮分别提交 2 个 url,所以我的 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 url 上使用正确的功能。我试过做类似
的事情
if request.form1['submit'] == 'Update':
if request.form2['submit'] == 'Update':
但这根本不起作用。我是 web 开发人员和 flask 的新手,所以详细的解释会很有帮助。
其次,由于提交工作不正常,我还尝试了一种替代方法来让我的工作继续进行,因此在我的 .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 目录中。
此外 当我在其中一个表格中输入 url 并单击提交时,它也会自动将相同的值放入第二个表格中。
很抱歉,如果这真的很长并且可能令人困惑,但我们将不胜感激。
:) 让我们看看是否可以稍微澄清一下。
第一个问题:
正如@dim 在他的评论中建议的那样,您有几个选择:
- 您可以将表单提交到单独的唯一网址。这样你就知道提交了哪个表单
- 您可以创建两个相似但不同的表单 classes(字段需要不同的名称,例如
prev_svn_url
和 cur_svn_url
)。这样在你的视图函数中,你实例化了两个不同的表单,你会知道哪个表单是基于 form.validate_on_submit()
提交的
- 第三个选项是向提交按钮添加
name
属性,然后将 value
属性更改为 'Update Previous' 和 'Update Current' 之类的属性。这样在您的视图函数中,您可以检查 request.data[<submit button name>]
的值以确定 'Update Previous' 是否被按下或 'Update Current'.
第二个问题:
正在创建多个目录,因为您在每次加载页面以显示表单以及表单被 posted 时调用 createDir()
。为了只创建一次,您需要某种逻辑来确定该目录之前未在调用 createDir()
之前创建
此外:由于两个表单来自相同的 SVN_Path class,它们读取 post 数据的方式完全相同,这就是为什么您在表单 1 中键入的内容会出现在表单中的原因2.
现在我的 2 美分:
我假设您正在尝试编写某种应用程序,将两个 SVN 网址作为输入,创建一个文件夹并对该文件夹中的这些网址执行某些操作。如果是这种情况,那么您当前的处理方式效率低下并且效果不佳。你可以只用一种形式 class 有 2 svn_url 字段(当然有不同的名称),然后在一个 post.
中处理所有这些
编辑:提交按钮的作用是告诉浏览器您已准备好将表单上的数据发送到服务器。在这种情况下,您应该只需要一个提交按钮(呈现时 SubmitFiled =>)。单击那个提交按钮会将数据从两个输入字段发送到您的视图函数。
您的表单应该类似于:
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)
我非常想创建一个需要 2 个 svn urls 并用它们做一些事情的网络应用程序。
我的表单代码很简单,我也在用WTForms
class SVN_Path(Form):
svn_url=StringField('SVN_Path',[validators.URL()])
我正在尝试创建 2 个带有 2 个提交按钮的表单,这些按钮分别提交 2 个 url,所以我的 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 url 上使用正确的功能。我试过做类似
的事情if request.form1['submit'] == 'Update':
if request.form2['submit'] == 'Update':
但这根本不起作用。我是 web 开发人员和 flask 的新手,所以详细的解释会很有帮助。
其次,由于提交工作不正常,我还尝试了一种替代方法来让我的工作继续进行,因此在我的 .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 目录中。
此外 当我在其中一个表格中输入 url 并单击提交时,它也会自动将相同的值放入第二个表格中。
很抱歉,如果这真的很长并且可能令人困惑,但我们将不胜感激。
:) 让我们看看是否可以稍微澄清一下。
第一个问题:
正如@dim 在他的评论中建议的那样,您有几个选择:
- 您可以将表单提交到单独的唯一网址。这样你就知道提交了哪个表单
- 您可以创建两个相似但不同的表单 classes(字段需要不同的名称,例如
prev_svn_url
和cur_svn_url
)。这样在你的视图函数中,你实例化了两个不同的表单,你会知道哪个表单是基于form.validate_on_submit()
提交的
- 第三个选项是向提交按钮添加
name
属性,然后将value
属性更改为 'Update Previous' 和 'Update Current' 之类的属性。这样在您的视图函数中,您可以检查request.data[<submit button name>]
的值以确定 'Update Previous' 是否被按下或 'Update Current'.
第二个问题:
正在创建多个目录,因为您在每次加载页面以显示表单以及表单被 posted 时调用 createDir()
。为了只创建一次,您需要某种逻辑来确定该目录之前未在调用 createDir()
此外:由于两个表单来自相同的 SVN_Path class,它们读取 post 数据的方式完全相同,这就是为什么您在表单 1 中键入的内容会出现在表单中的原因2.
现在我的 2 美分:
我假设您正在尝试编写某种应用程序,将两个 SVN 网址作为输入,创建一个文件夹并对该文件夹中的这些网址执行某些操作。如果是这种情况,那么您当前的处理方式效率低下并且效果不佳。你可以只用一种形式 class 有 2 svn_url 字段(当然有不同的名称),然后在一个 post.
中处理所有这些编辑:提交按钮的作用是告诉浏览器您已准备好将表单上的数据发送到服务器。在这种情况下,您应该只需要一个提交按钮(呈现时 SubmitFiled =>)。单击那个提交按钮会将数据从两个输入字段发送到您的视图函数。
您的表单应该类似于:
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)