Создание Web Service на языке Python

Для запуска веб-приложения, а в нашем случае лишь 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()