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

Пользовательские типы имеют собственное пространство идентификаторов, то есть когда компилятор разбирает файл, он сохраняет каждый идентификатор в соответствующем пространстве.

Когда вы ссылаетесь на tm, компилятор C (как C ++) будет искать этот идентификатор в пространстве глобального идентификатора. Затем компилятор C ++ будет искать в пользовательском пространстве идентификаторов типов, если ранее не нашел символ.

В принципе, если вы хотите иметь такое же поведение, как на C ++, добавьте эту строку:

typedef struct tm tm;

Вы можете объединить объявление структуры и typedef следующим образом:

typedef struct tm { int field } tm;

Или используя анонимную структуру:

typedef struct { int field } tm;

То же поведение применяется для enum и union:

typedef enum { VALUE } myEnum;
typedef union { int integer; char charArray[4]; } myUnion;
37
задан nikow 22 February 2011 в 14:45
поделиться

2 ответа

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

файл сервера 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()
51
ответ дан nikow 22 February 2011 в 14:45
поделиться
  • 1
    Действительно я думал, что это были кортежи и атрибуты, которые составили отношения, которые тогда составили базы данных:) – Conrad Frix 10 December 2012 в 23:02

Используйте ссылочная реализация 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.

9
ответ дан Jurn Ho 22 February 2011 в 14:45
поделиться
  • 1
    Не неправильно, но ' row' и ' column' все еще обычно принимаются условия в контексте реляционных баз данных. – TJ Thind 10 December 2012 в 23:06
Другие вопросы по тегам:

Похожие вопросы: