Python 相当于 PHP isset($_POST)

Python equivalent of PHP isset($_POST)

我正在处理一个有两个提交按钮的表单。

根据 this SO accepted answer,可以知道在 PHP 中按下了哪个提交按钮,执行如下操作:

<input type="submit" name="publish" value="Publish">
<input type="submit" name="save" value="Save">

<?php
    if (isset($_POST['publish'])) {
        # Publish-button was clicked
    }
    elseif (isset($_POST['save'])) {
        # Save-button was clicked
    }
?>

现在,如果可能的话,我需要对 Python 做同样的事情。 目前,我正在检索 POSTed 值,例如:

POST={}
args=sys.stdin.read().split('&')

for arg in args:
    t=arg.split('=')
    if len(t)>1: k, v=arg.split('='); POST[k]=v

但是,这样做我只能知道我的表单的值,而不知道它们是否实际设置了。

if POST.get('publish', 'default_value') 之类的东西将始终计算为 True,就像在我的表单中一样,它的值 (Publish) 已设置。

我该怎么做才能模仿 PHP 集?有没有办法在 Python 最好不用 fameworks 的情况下做到这一点?

编辑

在@04FS 发表评论后,我运行 进行了一个简单的测试来检查我的假设是否正确,而且看起来确实如此。

这是我的测试。我按下两个按钮之一,但无论如何,我收到:

import sys
import cgi
import cgitb

cgitb.enable()
print ("Content-type: text/html\n\n")

# 
POST={}
args=sys.stdin.read().split('&')

for arg in args:
    t=arg.split('=')
    if len(t)>1: k, v=arg.split('='); POST[k]=v

if POST.get('publish', 'default_value'):
    print("<p>Publish was pressed</p>")

if POST.get('save', 'default_value'):
    print("<p>Save was pressed</p>")

输出为:

Publish was pressed

Save was pressed

此处的错误是您在 get 方法调用中提供了默认值。如果 publish 未在输入数据中设置,则 POST.get('publish', 'default_value') returns default_value。当您通过 if 检查它时,这是一个 true-y 值 - 所以您会得到两个输出,而不管实际单击了哪个按钮来提交表单。

这里你只需要 POST.get('publish') - returns 一个值,如果参数实际存在 - 或者 null/false/whatever(不知道 [=20 中的详细信息) =]), 如果没有。

这是一种非常有效的方法来处理 Python Flask

中的多个提交按钮

前端:

<form method="POST" enctype="multipart/form-data">
          <input type ="submit" name="action" value="upload">

          <input type ="submit" name="action" value="download">

          <input type ="submit" name="action" value="next">
 </form>

后端:

if request.form['action'] == 'upload':
    return 'upload pressed'
elif request.form['action'] == 'download':
    return 'download pressed'
elif request.form['action'] == 'next':
    return 'next pressed'