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

时间:2015-02-06 11:15:01

标签: 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>

calci.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

由于

2 个答案:

答案 0 :(得分:2)

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

这种工作方式是典型的&#34; Web 1.0&#34;应用程序(与大约十年前使用的&#34; Web 2.0&#34;术语相对)。 现代Web应用程序使用在客户端运行的逻辑(在Javascript代码中)来发出HTTP请求以仅检索所需的数据 - 而这些客户端逻辑会将您的结果放在页面中的适当位置,而无需重新加载这页纸。这就是通常所说的&#34; ajax&#34;。它并不复杂,但应用程序的html + javascript方面变得更加复杂。

我认为应该真正理解&#34; Web 1.0&#34;在做“阿贾克斯方式”之前的方式&#34;。在您的情况下,假设您的包含计算器表单的HTML位于名为&#34; calc.html&#34;的文件中。在其中,结果应该位于其中,放置一个可以通过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标头,它包含在上面的最小形式中。

(我将完全实现原始&#39; {result}&#39;字符串的方式,不要在初始计算器表单中显示为从0开始的练习 - 路径是通过CGI脚本获取初始计算器html模板,而不是静态地(也许是相同的) - 只需填充&#34;结果&#34;使用&#34; 0&#34;或空字符串)

答案 1 :(得分:0)

您可以在Java脚本的帮助下传输响应。 在print(“ window.location = url”)下使用