【问题标题】:python cgi script receiving form datapython cgi脚本接收表单数据
【发布时间】:2013-06-09 10:13:46
【问题描述】:

我正在尝试创建一个 python 程序,该程序将从使用 html 的表单接收信息。
这就是我的 html 代码。

<html>
<head>
<title> NBA Survey! </title></head>
<form method = "POST" action = "result.py">
<hr>
Who do you think is the best Small Forward in the NBA right now? <br>
          <input type="radio" name="9" value="Chris Paul"> Chris Paul  <br>
            <input type="radio" name="9" value="Tony Parker"> Tony Parker <br>
            <input type="radio" name="9" value="Stephen Curry"> Stephen Curry <br>
            <input type="radio" name="9" value="Rajon Rondo"> Rajon Rondo <br>
            <input type="radio" name="9" value="Derrick Rose"> Derrick Rose <br>
            <input type="radio" name="9" value="Kyrie Irving"> Kyrie Irving <br>
            <input type="radio" name="9" value="Russell Westbrook"> Russell Westbrook <br>
            <input type="radio" name="9" value="Other"> Other <br>
    <input type="submit" name="submit" value="submit">
    </form>
    </body>
    </html>

对于python中的代码,这是我目前所拥有的。

#!/usr/bin/python
import cgitb; cgitb.enable()
import cgi
import sys
form = cgi.FieldStorage()
if form.getvalue('9') = 'Chris Paul':
    f1.write('Chris Paul')
f2 = open('results.txt','a')
g2 = f2.read().split(',')
page += 'Chris Paul: ' + g2.count('Chris Paul')

我正在尝试创建一个 python 页面,在我点击 html 页面上的提交后,它会将用户重定向到一个新页面,其中将显示调查结果。调查将在其他人可以投票的服务器上进行。

页面看起来像:

克里斯·保罗:(票数)
托尼·帕克:(票数) 等等……

所有帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: python html forms cgi


    【解决方案1】:

    先阅读 Sylvain Leroux 的回答。

    #!/usr/bin/python
    import cgitb; cgitb.enable()
    import cgi
    import sys
    from collections import Counter
    
    form = cgi.FieldStorage()
    
    name = form.getvalue('9')
    if name:
        with open('results.txt', 'a') as f:
            f.write(name + '\n')
    
    print('Content-Type: text/plain\n')
    
    with open('results.txt') as f:
        counts = Counter(line.strip() for line in f)
    
    for name, count in counts.most_common():
        print('{}: {}'.format(name, count))
    

    【讨论】:

      【解决方案2】:

      我认为在获得任何具体帮助之前,您必须缩小问题范围并进行更多个人研究。但是……

      ...乍一看,您的问题s提出了更多问题s

      • 如何在“投票”表单和“结果”页面之间持久化数据?我不熟悉 Python CGI 模块的低级用法,但据我所知,您只需将数据存储在纯 Python 变量中,一旦脚本完成,这些变量就会消失。或者,如果我没记错的话,CGI 脚本仅针对 一个 请求运行。
      • 您确定要进行重定向吗?如果是这样,您的“表单”处理 CGI 脚本只需响应相应的301302 http 状态代码。另一方面,您可能希望将投票结果显示为表单的“正常”响应?在这种情况下,只需在此处生成一个有效的 HTML 文档并返回一个 200 状态码。
      • 您将如何处理“意外”的表单数据?您不能信任传入的请求。并且可能已经伪造了一个请求,例如传送对“唐老鸭”的投票。您必须为此做好准备(顺便说一句,“9”对于您的表单字段来说是一个非常糟糕的非描述性名称......)
      • 这可能被视为次要问题(甚至没有问题),但是......嘿......我们在这里很专业!因此,您的 HTML 缺少“body”标签,并且没有正确的意图。

      还有一些工作要做!祝你好运。

      【讨论】:

      • 感谢您的意见。这是我第一次做这样的事情。
      • 结果页面是一个简单的空白页面,以数值形式显示每个单选选项获得的票数。
      • 我打算创建的页面是一个带有使用python作为引擎的结果页面的html调查页面。有了这个,我相信数据将存储在python中。 “重定向”在这里可能是一个糟糕的词选择。在 html 页面中,提交按钮已经将用户带到了结果页面,所以我想我在那个类别中很好。这将是一个使用 Radio 选项的简单调查,因此不会出现意外数据。另一个选择也是收音机。
      • @user2480957 我不明白的一个主要 事情是数据将如何persist 从一个请求到下一个请求。假设我投票给“托尼帕克”(是的!法国!)。我是第一个选民。所以托尼的计数器从 0 变为 1。太好了。该脚本产生了一个很好的输出,显示 100% 的投票给了托尼。脚本结束。所有 Python “普通”变量都丢失了......
      • ... 几秒钟后,其他人投了票。说德里克罗斯(去芝加哥公牛队!)。但是,这是您脚本的全新运行。带有全新的变量。德里克罗斯的投票计数从 0 变为 1。因此获得 100% 的选票。等等。您必须为您的脚本找到一种方法来记住从一次运行到另一次运行的内容。此外,“内存”应该足够聪明,可以正确处理两个并发(“同时”)访问——就像两个用户同时投票一样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多