使用Python CGI动态表单数据

时间:2017-06-11 17:54:14

标签: python cgi form-data

最近,我决定学习基本的Python CGI。最好的练习方法是在脑海中构建一个简单的项目,然后实现它。项目是这样的:我将生成一个表单,首先包含一个“输入类型文本”以获得成绩,然后两个“输入类型提交”,其中一个是“添加新成绩”,另一个是“计算” ...首先,用户将输入成绩,如果他提交计算,则成绩将转换为基础4 GPA。但只要他提交新的等级,新的“输入类型文本”将继续生成,并且他将输入他想要的多个等级,然后继续提交计算,这将返回基础4 GPA。好吧,至少这是我想要实现的目标。

我在Windows 10 PC上使用WAMP。

但我有两个问题。首先,我无法设置我的WAMP服务器来运行我写的脚本。这就是为什么我不能按预期工作的原因。我转到我的C:\wamp\bin\apache\apache2.4.23\conf目录,在httpd.conf文件中,我在适当的位置添加了行Options Indexes FollowSymLinks Multiviews ExecCGI,并取消注释了行AddHandler cgi-script .cgi .py。然后我将我的脚本放在目录C:\wamp\www\中。但我的浏览器只是继续搜索,然后发出超时消息。

第二个问题是我怀疑代码是否会按预期工作,因为我不知道如何检查是否设置了任何“输入类型提交”。我的脚本完全如下:

#!C:\Users\Nima\AppData\Local\Programs\Python\Python36-32\Python.exe
import cgi

def convertNearestBase(point):
bases = [0.0, 0.3, 0.7, 1.0, 1.3, 1.7, 2.0, 2.3, 2.7, 3.0, 3.3, 3.7, 4.0]
minVal = 0.4
result = 0

for base in bases:
    if minVal > abs(point - base):
        minVal = abs(point - base)
        result = base

return result


def convertSinglePoint(point):
transpoint = point/20 - 1

return convertNearestBase(transpoint)


i = 1
form = cgi.FieldStorage()
sumVal = convertSinglePoint(form.getvalue("point1"))
addNew = form.getvalue("addNew")
calc = form.getvalue("calculate")

print('Content-Type: text/plain\n\n')
print('<html><head><title>Online GPA Converter</title>')
print('<link rel="stylesheet" type="text/css" href="main.css" /></head>')
print('<body><h1>Online GPA Converter</h1><div class="container">')
print('<form method="post" action="">')
print('Enter point: <input type="number" name="point1" min="0" max="100" />')
print('<input type="submit" name="addNew" value="Add New" />')
while not calc:
if addNew:
    i += 1
    textEditName = "point" + str(i)
    print('Enter point: <input type="number" name="{}" min="0" max="100" />'.format(textEditName))
    print('<input type="submit" name="addNew" value="Add New" />')
    point = form.getvalue(textEditName)
    sumVal += convertSinglePoint(point)

print('<input type="submit" name="calculate" value="Calculate GPA" />')
print('</form></div>')

finalPoint = convertNearestBase(sumVal/i)
if calc:
print('<p>Your GPA is {}</p>'.format(finalPoint))

print('</body></html>')

我知道我要求太多,但我真的需要帮助。求你帮帮我。

1 个答案:

答案 0 :(得分:0)

尼玛,CGI真的是过时的技术。有两个原因:它的性能和复杂性。 CGI为每个请求生成新进程。这增加了太多的开销。现代替代品是FastCGI。但它本身的水平太低了。如果您只是想学习如何在Python上编写Web应用程序,最好从现代框架开始。我建议使用烧瓶,因为它非常简约,但非常强大且记录良好。它内置了适合调试目的的Web服务器。