ठीक है, मुझे लगता है कि अब मैं अपने ही सवाल का जवाब कर सकते हैं। यहां सर्वर पर किसी संख्या के वर्ग की गणना करने के लिए एक उदाहरण कार्यान्वयन है। अगर कोई सुधार या गलत धारणाएं हैं तो कृपया मुझे बताएं।
अजगर सर्वर फ़ाइल:
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()
... और HTML फ़ाइल (मैं इसे 'frontend.html' कहते हैं, दुर्भाग्य से नाम जावा स्क्रिप्ट कोड में दिखाई देना चाहिए और साथ ही):
<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 का उपयोग करना अधिक सुविधाजनक होगा, लेकिन सादगी के हित में मैं इसे छोड़ दूंगा। एक बहुत ही सहज ज्ञान युक्त के लिए
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()
बस तुलना के लिए, यहां एक रामज़ उदाहरण है: http://news.ycombinator.com/item?id=383960 – jfs
"क्या कोई पायदान नहीं है तो मानक पायथन हैंडलर पर वापस आने का कोई तरीका है?" ज्यादा मतलब नहीं है। आपको लगता है कि "मानक" हैंडलर क्या है? –
एसएलओटी: पहले सर्वर कार्यान्वयन में SimpleHTTPRequestHandler का व्यवहार केवल POST अनुरोधों के लिए बदला जाता है। इसलिए HTML फ़ाइल लोड हो रहा है इसलिए किसी भी अतिरिक्त कोड की आवश्यकता नहीं है। डब्लूएसजीआई कार्यान्वयन में मुझे स्पष्ट रूप से HTML भेजना है, जीईटी स्वचालित रूप से संभाला नहीं जाता है। – nikow