好的,我想我现在可以回答我自己的问题。这是用于在服务器上计算数字平方的示例实现。如果有任何改进或误解,请告诉我。
python服务器文件:
import threadingimport webbrowserimport baseHTTPServerimport SimpleHTTPServerFILE = 'frontend.html'PORT = 8080class TestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): """The test example handler.""" def do_POST(self): """Handle a post request by returning the square of the number.""" length = int(self.headers.getheader('content-length')) data_string = self.rfile.read(length) try: result = int(data_string) ** 2 except: result = 'error' self.wfile.write(result)def open_browser(): """Start a browser after waiting for half a second.""" def _open_browser(): webbrowser.open('http://localhost:%s/%s' % (PORT, FILE)) thread = threading.Timer(0.5, _open_browser) thread.start()def start_server(): """Start the server.""" server_address = ("", PORT) server = baseHTTPServer.HTTPServer(server_address, TestHandler) server.serve_forever()if __name__ == "__main__": open_browser() start_server()…和HTML文件(我称之为“ frontend.html”,不幸的是,该名称也必须出现在Javascript代码中):
<html><head><title>AJAX test</title></head><body><script type="text/javascript">function xml_http_post(url, data, callback) { var req = false; try { // Firefox, Opera 8.0+, Safari req = new XMLHttpRequest(); } catch (e) { // Internet Explorer try { req = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { req = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { alert("Your browser does not support AJAX!"); return false; } } } req.open("POST", url, true); req.onreadystatechange = function() { if (req.readyState == 4) { callback(req); } } req.send(data);}function test_button() { var data = document.test_form.test_text.value; xml_http_post("frontend.html", data, test_handle)}function test_handle(req) { var elem = document.getElementById('test_result') elem.innerHTML = req.responseText}</script><form name=test_form>sqr(<input type="text" name="test_text" value="0" size="4">) =<span id="test_result">0</span><input type=button onClick="test_button();" value="start" title="start"></form></body></html>当然,将jQuery用于XML请求会更加方便,但是为了简单起见,我将其保留为原来的样子。
最后,使用WSGI的另一种实现(不幸的是,如果请求不是POST的话,我看不到依靠标准文件服务处理程序的方法):
import threadingimport webbrowserfrom wsgiref.simple_server import make_serverFILE = 'frontend.html'PORT = 8080def test_app(environ, start_response): if environ['REQUEST_METHOD'] == 'POST': try: request_body_size = int(environ['CONTENT_LENGTH']) request_body = environ['wsgi.input'].read(request_body_size) except (TypeError, ValueError): request_body = "0" try: response_body = str(int(request_body) ** 2) except: response_body = "error" status = '200 OK' headers = [('Content-type', 'text/plain')] start_response(status, headers) return [response_body] else: response_body = open(FILE).read() status = '200 OK' headers = [('Content-type', 'text/html'), ('Content-Length', str(len(response_body)))] start_response(status, headers) return [response_body]def open_browser(): """Start a browser after waiting for half a second.""" def _open_browser(): webbrowser.open('http://localhost:%s/%s' % (PORT, FILE)) thread = threading.Timer(0.5, _open_browser) thread.start()def start_server(): """Start the server.""" httpd = make_server("", PORT, test_app) httpd.serve_forever()if __name__ == "__main__": open_browser() start_server()


