Как реализовать минимальный сервер для AJAX в Python?

Я хочу создать очень простой графический интерфейс на основе HTML / AJAX для программы Python. Таким образом, интерфейс – это HTML-страница, которая связывается с программой через AJAX. Можете ли вы дать мне минимальную реализацию для серверной части, используя python SimpleHTTPServer.SimpleHTTPRequestHandler ?

Простым примером может быть текстовое поле и кнопка. Когда кнопка нажата, содержимое поля отправляется на сервер, который затем отправляет ответный ответ. Я знаю, что в Python есть много мощных решений, но я хотел бы сохранить это очень просто. Я уже нашел несколько хороших примеров для такого сервера (например, здесь ), но до сих пор я не мог придумать по-настоящему минимальный.

В случае, если вы задаетесь вопросом, почему я хочу реализовать графический интерфейс таким образом: мой фокус для этого приложения заключается в отображении большого количества данных в хорошем макете с минимальным взаимодействием, поэтому использование HTML + CSS представляется наиболее удобным (и я уже был используя его для отображения неинтерактивных данных).

  • Анализ аякс-ответов для получения окончательного содержания url в Scrapy?
  • Получение пустого объекта ImmutableMultiDict из данных запроса jQuery
  • CORS с базой pythonHTTPserver 501 (неподдерживаемый метод («ОПЦИИ»)) в хроме
  • web2py Ajax search
  • Django ajax HttpResponse json error Неожиданный токен d
  • Неопределенный результат запроса Deferred AJAX на Flask
  • Любая хорошая структура AJAX для приложений Google App Engine?
  • Как я могу отправить объект JSON из сценария Python в jQuery?
  • 3 Solutions collect form web for “Как реализовать минимальный сервер для AJAX в Python?”

    Хорошо, думаю, теперь я могу ответить на свой вопрос. Ниже приведен пример реализации для вычисления квадрата числа на сервере. Пожалуйста, дайте мне знать, есть ли какие-либо улучшения или неправильные представления.

    файл сервера 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() 

    … и 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 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() 

    Используйте ссылочную реализацию WSGI . В конечном счете, вы будете счастливее.

     from wsgiref.simple_server import make_server, demo_app httpd = make_server('', 8000, demo_app) print "Serving HTTP on port 8000..." # Respond to requests until process is killed httpd.serve_forever() 

    Demo_app относительно легко писать; он обрабатывает ваши запросы Ajax.

    Спасибо за очень интуитивный пример @nikow, я пытался следовать вашему примеру, но получил ошибку:

    (процесс: 10281): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' не удалось

    Я изменил ваш код, чтобы удовлетворить мои потребности.

     webbrowser.open('file:///home/jon/workspace/webpages/frontend_example/%s' % FILE) // skipped the port part httpd = make_server("", 8080, test_app) // hardcoded it here. 

    мой html-файл должен быть помещен на веб-сервер? Я еще не положил его!

    Python - лучший язык программирования в мире.