让cgi.FieldStorage存储用户输入?

1 投票
1 回答
643 浏览
提问于 2025-04-16 15:49

我写了一个简单的Python CGI脚本,但它有个bug:

#!/usr/bin/python2.7

import cgi,sys,random

sys.stderr = sys.stdout

num1 = random.randrange(1,11)
num2 = random.randrange(1,11)
answer = num1 + num2

print("Content-type: text/html\n")
print("<code>%d + %d :</code>") % (num1,num2)
print("""
<form method=POST action="">
<hr>
<th align=right>
<code><b>Answer:</b></code>
<input type=text name="answer">
<tr>""")

form = cgi.FieldStorage()

try:
    if form["answer"].value == str(answer):
        print "<br><b>Good</b>"
    else:
        print "<br><b>Wrong</b>"

except KeyError:
    pass

每次执行这段代码时,数字都会重新生成,因此无法将用户输入的内容与答案进行比较,因为cgi.FieldStorage并不会保存这些输入:

enter image description here

PHP程序员使用“session_start()”来实现我想要的功能:

<?php
//Start the session so we can store what the code actually is.
session_start();
$text = rand(1,11);
$_SESSION["answer"] = $answer;
.......
?>

那Python该怎么做呢?我们该如何实现?

补充:我其实不太确定这是不是会话(sessions)……我只需要一种方法来保存用户输入的内容,以便我可以将他的答案与正确答案进行比较。

1 个回答

0

你有几个选择。一个是Beaker。它是一个专门用来处理缓存和会话存储的工具。虽然我不太确定它是怎么和普通的CGI应用结合在一起的,但应该不会太难。这有点像PHP中的session_start()和把东西存到$_SESSION里。Beaker提供了多种存储会话信息的方法(比如用带有会话数据的cookie,或者用带有会话ID的cookie等等)。

我想到的另一种方法是使用一个隐藏的<input>元素来存放原始数字。这个元素会和表单一起提交,然后在form中可以获取到。老实说,这种做法并不好。它容易受到用户攻击,因此不安全。我知道这只是一个测试应用,但还是建议从一开始就走上正轨 :)

撰写回答