【问题标题】:Dynamic Form Data with Python CGI使用 Python CGI 的动态表单数据
【发布时间】:2017-06-11 17:54:14
【问题描述】:

最近,我决定学习基本的 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>')

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

【问题讨论】:

    标签: python cgi form-data


    【解决方案1】:

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

    【讨论】:

    • 我不会将它用于任何实际应用。我只是在学习。顺便说一句,几年前我尝试过 Django 并且讨厌它。但不幸的是,您的帖子无法回答这个问题。另外,你们在 Yandex 使用什么?不是烧瓶,对吧?
    • Yandex 中有很多工作组,我们使用不同的工具。所以我不能代表整个 Yandex。但是我们的大部分生产服务都是用 C++(后端)或 node.js(我知道的一些前端)编写的。 Python 主要用于后台任务。是的,我们在这里使用烧瓶。
    • 哇,太棒了!为 Yandex 工作一定很酷。但我只是一个初学者,我想从像你这样的大师那里得到答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2016-05-28
    • 2019-10-16
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多