O.K., tôi nghĩ giờ đây tôi có thể trả lời câu hỏi của riêng mình. Đây là một ví dụ thực hiện để tính toán bình phương của một số trên máy chủ. Vui lòng cho tôi biết nếu có bất kỳ cải tiến hoặc quan niệm sai lầm nào.
tập tin máy chủ python:
import threading
import webbrowser
import BaseHTTPServer
import SimpleHTTPServer
FILE = 'frontend.html'
PORT = 8080
class 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()
... và các tập tin HTML (tôi gọi nó là 'frontend.html', không may tên đã xuất hiện trong mã JavaScript cũng):
<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>
Tất nhiên sẽ thuận tiện hơn khi sử dụng jQuery cho yêu cầu XML, nhưng vì lợi ích của sự đơn giản, tôi sẽ để nó như thế.
Cuối cùng một thực hiện thay thế sử dụng WSGI (tiếc là tôi đã không nhìn thấy một cách để rơi trở lại vào trình điều khiển file phục vụ tiêu chuẩn nếu yêu cầu không phải là một POST):
import threading
import webbrowser
from wsgiref.simple_server import make_server
FILE = 'frontend.html'
PORT = 8080
def 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()
Để so sánh, đây là ví dụ về Ramaze: http://news.ycombinator.com/item?id=383960 – jfs
"có cách nào để quay trở lại trình xử lý Python chuẩn nếu yêu cầu không phải là POST không?" Không có nghĩa là nhiều. Bạn nghĩ bộ xử lý "chuẩn" là gì? –
S.Lott: Trong lần triển khai máy chủ đầu tiên, hành vi của SimpleHTTPRequestHandler chỉ thay đổi đối với các yêu cầu POST. Tải tệp HTML do đó không yêu cầu bất kỳ mã bổ sung nào. Trong triển khai WSGI, tôi phải gửi một cách rõ ràng HTML, GET không được xử lý tự động. – nikow