Простой сервер 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 лучше показывают, как это работает.