让cgi.FieldStorage存储用户输入?
我写了一个简单的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并不会保存这些输入:
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
中可以获取到。老实说,这种做法并不好。它容易受到用户攻击,因此不安全。我知道这只是一个测试应用,但还是建议从一开始就走上正轨 :)