Простой сервер Python для обработки запросов GET и POST с помощью JSON

Я пытаюсь создать простой сервер Python, чтобы проверить мой интерфейс. Он должен иметь возможность обрабатывать запросы GET и POST. Данные должны быть всегда в формате JSON, пока они не будут переведены в HTTP-запрос / ответ. Для обработки каждого запроса должен вызываться скрипт с соответствующим именем.

server.py

#!/usr/bin/env python

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import SocketServer
import json
import urlparse
import subprocess

class S(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()

    def do_GET(self):
        self._set_headers()
        parsed_path = urlparse.urlparse(self.path)
        request_id = parsed_path.path
        response = subprocess.check_output(["python", request_id])
        self.wfile.write(json.dumps(response))

    def do_POST(self):
        self._set_headers()
        parsed_path = urlparse.urlparse(self.path)
        request_id = parsed_path.path
        response = subprocess.check_output(["python", request_id])
        self.wfile.write(json.dumps(response))

    def do_HEAD(self):
        self._set_headers()

def run(server_class=HTTPServer, handler_class=S, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print 'Starting httpd...'
    httpd.serve_forever()

if __name__ == "__main__":
    from sys import argv

    if len(argv) == 2:
        run(port=int(argv[1]))
    else:
        run()

пример testscript.py для обработки запросов, которые в этом случае просто возвращают объект JSON.

#!/usr/bin/env python
return {'4': 5, '6': 7}

сервер должен для пример возврата {'4': 5, '6': 7} для ответа в формате http://www.domainname.com:8000/testscript.

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

2 ответов


вот пример клиента сервера в python. Я использую бутылки библиотека для обработки запросов к серверу и создать сервер.

Код

import subprocess
from bottle import run, post, request, response, get, route

@route('/<path>',method = 'POST')
def process(path):
    return subprocess.check_output(['python',path+'.py'],shell=True)

run(host='localhost', port=8080, debug=True)

он запускает сервер на localhost:8080. Вы можете передать имя файла, который вы хотите запустить. Убедитесь, что файл находится в том же пути для вышеуказанного кода для работы или изменения пути для запуска из другого каталога. Путь соответствует имени файла и вызывает


Я использую этот:

https://gist.github.com/earonesty/ab07b4c0fea2c226e75b3d538cc0dc55

from apiserve import ApiServer, ApiRoute

class MyServer(ApiServer): 
        @ApiRoute("/popup")
        def addbar(req):
            return {"boo":req["bar"]+1}

        @ApiRoute("/baz")
        def justret(req):
            if req:
                 raise ApiError(501,"no data in for baz")
            return {"obj":1}

MyServer("127.0.0.1",8000).serve_forever()

эта конкретная оболочка позволяет легко прослушивать порт 0 (случайный высокий порт), который некоторые фреймворки запутывают. Он автоматически обрабатывает запросы GET / POST для всех маршрутов и сливается в аргументах URI с аргументами объекта JSON верхнего уровня. Что в большинстве случаев меня устраивает.

это намного легче, чем большинство интегрированные системы. Тестовые примеры в gist лучше показывают, как это работает.