使用Python的Bottle检查哪个“提交”POST按钮

时间:2012-11-01 08:45:03

标签: python html bottle

假设您有一个包含多个提交的表单:

<form method="POST" action="/etc">
    <input name="foo" type="submit" value="Foo!">
    <input name="bar" type="submit" value="Bar!">
</form>

检查在PHP中按下了哪个提交按钮非常简单:

if (isset($_POST['foo'])) { return 'foo' }
if (isset($_POST['bar'])) { return 'bar' }

什么是Python.Bottle等价物?

我试过了:

if (request.POST.get('foo')):
    return 'foo'
if (request.POST.get('bar')):
    return 'bar'

但是返回KeyError,意味着'foo'和'bar'不在POST dict中。

我还尝试在表单中添加一个测试字段,并在提交表单时返回该字段中的值,并且完美无缺,因此表单正在发布。

有一点可能很重要:表单中的提交按钮是动态生成的。

编辑:发现可能的问题。我正在使用jQuery发布和序列化表单数据,但显然jQuery的序列化忽略了输出中的提交按钮,这肯定会导致我所看到的。目前正致力于解决方法,但仍然感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以尝试在表单中添加enctype="multipart/form-data"吗?

<form action="/etc" method="post" enctype="multipart/form-data">
    <input name="foo" type="submit" value="Foo!">
    <input name="bar" type="submit" value="Bar!">
</form>

根据Bottle Documentation

  

BaseRequest.forms

     

url-encodedmultipart/form-data解析的表单值   编码POSTPUT请求正文。结果重新调整为   FormsDict。所有键和值都是字符串。存储文件上传   分别在files

  

BaseRequest.POST

     

formsfiles的值合并为一个FormsDict。   值可以是字符串(表单值)或实例   cgi.FieldStorage(文件上传)。

答案 1 :(得分:2)

问题是jQuery的序列化函数忽略了提交按钮。

我通过在所有相关的提交按钮中添加一个类(submitButton)并在表单中添加一个隐藏的输入(theHiddenInput),然后添加以下内容来解决这个问题处理程序:

$('.submitButton').click(function() {
    this.form.theHiddenInput.value = this.name;
});

以下代码相当于我以前的代码:

if (request.POST.get('theHiddenInput') == 'foo'):
    return 'foo'
if (request.POST.get('theHiddenInput') == 'bar'):
    return 'bar'

也许这将有助于将来。