Для запуска веб-приложения, а в нашем случае лишь WebService воспользуемся библиотекой Werkzeug.
Вызовем метод
run_simple('localhost', 4000, application)
В качестве аргументов метод принимает адрес сервера, где будет распологаться веб-сервис, порт на , котором , будет «слушать» сервер и имя метода реализующего саму логику работы с запросами от клиента и возвратом ему ответов.
application
— это и есть имя метода , реализующего логику Request-Responce.
Данный метод нужно помечать тегом @Request.application
, в качестве аргумента ему передается request
, а возвращает он клиенту Response
.
Простой пример веб-приложения можно увидеть ниже:
from werkzeug.wrappers import Request, Response @Request.application def application(request): return Response('Hello World!') if __name__ == '__main__': from werkzeug.serving import run_simple run_simple('localhost', 4000, application)
Реализуем веб-сервис, который выполняет 3 метода : "get_products","get_alcohol_products","get_eatable_products"
. Для этого импортируем следующие пакеты:
from jsonrpc import JSONRPCResponseManager, dispatcher
Внутри метода application
привяжем в словаре dispatcher
реализацию желаемых методов следующим образом:
@Request.application def application(self,request): dispatcher["get_alcohol_products"] = self.get_alcohol_products dispatcher["get_eatable_products"] = self.get_eatable_products dispatcher["get_products"] = self.get_products response = JSONRPCResponseManager.handle(request.data, dispatcher) return Response(response.json, mimetype='application/json')
Таким образом при получении JSON запроса от клиента, содержащего название желаемого метода, будет вызываться соответствующий метод класса.
К примеру, HTTP Post запрос от клиента с JSON :
{"jsonrpc": "2.0", "params": [], "method": "get_products", "id": 0}
Вызовет метод self.get_products()
в нашем классе.
Проверить работоспособность веб-сервиса можно с помощью плагина Postman Launcher к броузеру Chrome. Либо воспользоваться тестом из самого проекта.
Полная версия веб-сервиса представлена ниже и ее также можно скачать здесь.
''' Created on Aug 25, 2016 @author: Maria Shpatserman ''' from werkzeug.wrappers import Request, Response from werkzeug.serving import run_simple from jsonrpc import JSONRPCResponseManager, dispatcher import xml.etree.ElementTree as ET import logging import ast import json class ServerJson(object): ''' classdocs ''' logging.basicConfig(filename='../logs/myapp.log', level=logging.INFO) def __init__(self): ''' Constructor ''' self.readJsonFile() logging.info(self.json_object) def readJsonFile(self): with open('../data/products.json', 'r') as f: self.json_object = json.load(f) @Request.application def application(self,request): logging.info(request.data) dispatcher["get_alcohol_products"] = self.get_alcohol_products dispatcher["get_eatable_products"] = self.get_eatable_products dispatcher["get_products"] = self.get_products response = JSONRPCResponseManager.handle(request.data, dispatcher) logging.info(response) logging.info(response.json) return Response(response.json, mimetype='application/json') def main(self): run_simple('localhost', 4000, self.application) def get_products(self): logging.info(self.json_object) return self.json_object def get_alcohol_products(self): return self.json_object["products"]["alcohol"] def get_eatable_products(self): return self.json_object['products']['eatable'] if __name__ == '__main__': ServerJson().main()