python - 如何使用 cgi python 脚本发送对 html 的响应

标签 python html webserver cgi

我正在尝试用 HTML 和 Python(使用 CGI)设计和实现一个基本计算器。下面给出的是一个静态 HTML 网页,它被重定向到一个 python 脚本 (calci.py),我可以在其中计算总和,但无法将结果附加到“输出”文本框。

calculator.html

<html>
<head>
    <title>Calculator</title>   
</head>   
<body>
    <form action="python_scripts/calci.py" method="post">
        Input 1 : <input type="text" name="input1"/><br>
        Input 2 : <input type="text" name="input2"/><br>    
        <input type="submit" value="+" title="add"  /><br>  
        output : <input type="text" name="output"/><br>
    </form>
</body>
</html>

钙化.py

import cgi
form = cgi.FieldStorage() 

input1 = form.getvalue('input1')
input2  = form.getvalue('input2')

output = str(int(input1)+int(input2))
#how to return the response to the html
#and append it to the textbox

谢谢

最佳答案

这不是 Web 应用程序的工作方式 - 至少不是简单的方式。 如果您的应用程序只想依赖浏览器和纯 HTML,则每个请求都必须将整个 html 页面作为字符串发送。您必须使用 Python 的字符串格式化功能将结果数字放在 HTML 表单中的正确位置。

这种工作方式是典型的“Web 1.0”应用程序(与大约十年前使用的“Web 2.0”术语相反)。 现代 Web 应用程序使用在客户端运行的逻辑,在 Javascript 代码中,发出 HTTP 请求以仅检索所需的数据 - 而且它们,此客户端逻辑会将您的结果放在页面中的正确位置,而无需重新加载这一页。这就是通常所说的“ajax”。它并没有那么复杂,但是应用程序的 html + javascript 端变得更加复杂。

我认为在采用“Ajax 方式”之前,应该真正理解“Web 1.0”方式。在您的情况下,假设您的包含计算器表单的 HTML 位于名为“calc.html”的文件中。在它里面,结果应该在的地方,放置一个可以被 Python 内置的原生字符串格式化方法理解的标记,比如 {result} -

<html>
<body>
...
calculator body
...
Answer: <input type="text" readonly="true" value={result} />
</body>
</html>

然后像这样重写你的代码:

import cgi
form = cgi.FieldStorage() 

input1 = form.getvalue('input1')
input2  = form.getvalue('input2')

result = int(input1)+int(input2)
html = open("calc.html".read())
header = "Content-Type: text/html; charset=UTF-8\n\n"

output = header + html.format(result=result)
print (output)

CGI 方式已经过时,但很适合学习:它依赖于您正在运行的整个程序,以及它打印到标准输出的任何内容都将被重定向到 HTTP 请求作为响应。这包括上面以最小形式包含的 HTTP header 。

(我将保留原始“{result}”字符串不显示在初始计算器表单中的方法的完整实现,作为您从 0 开始的练习 - 路径是获取初始计算器 html 模板也通过 CGI 脚本,而不是静态地,(也可能是相同的)- 只需用“0”或空字符串填充“结果”)

关于python - 如何使用 cgi python 脚本发送对 html 的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28364526/

相关文章:

python - 在 Matplotlib 中显示绘图之前获取空刻度标签

python - Pytorch BCELoss 对相同输入使用不同的输出

python - 如何集成 ZSH 和 (i)python?

html - 如何使用CSS最大化列表以消耗最大空间

html - 如何使用 Flexbox 将盒子居中?

perl - 使用独立的 Perl FastCGI/FCGI Web 服务器在 Perl 中测试 FastCGI 脚本

python - 连接具有不同时区的 pandas DataFrame 时可能出现的错误

javascript - 无法访问除第一行之外的其他行的值

javascript - 是否可以在 Ubuntu (LAMP) Web 服务器上运行 grunt?

linux - 我对积压的监听系统调用和套接字编程中的连接数的理解是否正确?