Уведомления

Группа в Telegram: @pythonsu

#1 Март 1, 2017 20:15:14

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Python JSON-RPC 2.0 API

4kpt_V
А с какого рожна скажиТЕ???

Да не я так, просто поинтересовался. Я аспиранта посадил, он на пиро накатал нужную нам систему для конвигурирования и запуска наших тренажеров в гетерогенной вычислительной среде год уже работает но пока не очень интенсивно используется. Пиро как раз. Мы сами хозяева во всей системе. До этого была только винда, а это кросплатформенный вариант. В результате часть моделей посадили на суперэвм (но это уже не система конфигруирования и запуска а другая система).



Офлайн

#2 Март 2, 2017 04:32:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Python JSON-RPC 2.0 API

doza_and
4kpt, намекает, что когда в интернетах переходят на Вы, в реале уже давно бьют друг-другу морды.



Офлайн

#3 Март 2, 2017 09:40:36

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Python JSON-RPC 2.0 API

FishHook
Красавчег.

doza_and
Я же написал, что pyro веСчь. Но только в том случае, когда у тебя в инфраструктуре только python иначе придется городить bridge между pyro и внешним сервисом. Скажу больше. В одном своем проекте использовал pyro и доволен. Где-то уже полгода в проде крутиться и не ломается.

Офлайн

#4 Март 2, 2017 20:34:16

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Python JSON-RPC 2.0 API

4kpt_V
Где-то уже полгода в проде крутиться и не ломается.
Как раз то что хотел узнать. А то у нас крутится долго но не интенсивно, посему непонятно насколько надежно.



Офлайн

#5 Март 6, 2017 16:19:31

annie_shlepak
Зарегистрирован: 2017-02-28
Сообщения: 4
Репутация: +  -1  -
Профиль   Отправить e-mail  

Python JSON-RPC 2.0 API

PooH
Сделайте минимальный пример, который запускается и выдает этот результат. Если к этому моменту сами не поймете в чем дело, обещаю посмотреть.
SERVER
 from werkzeug.wrappers import Request, Response
from werkzeug.serving import run_simple
from jsonrpc import JSONRPCResponseManager, dispatcher
from handlers.base import Base
HOST = 'localhost'
PORT = 80
class Server(Base, Response):
    @dispatcher.add_method
    def get_detailed_usage(self, service_ref, from_date, to_date):
        sql_where = []
        sql_vars = []
        if service_ref is not None:
            sql_where.append("pc.service_ref={}").format(service_ref)
            sql_vars.append(service_ref)
        if from_date is not None:
            sql_where.append("rc.start_time={}").format(from_date)
            sql_vars.append(from_date)
        if to_date is not None:
            sql_where.append("rc.end_time={}").format(to_date)
            sql_vars.append(to_date)
        # if excludeCallsCoveredByBundleAllowance is not None:
            # sql_where.append("excludeCallsCoveredByBundleAllowance={}").format(excludeCallsCoveredByBundleAllowance)
            # sql_vars.append(excludeCallsCoveredByBundleAllowance)
        sql_query = """
                SELECT
                pc.customer_ref,
                pc.service_ref,
                pc.contact_ref,
                rc.dnis_ref,
                #chair_pin_ref,
                #delegate_pin_ref
                #chair_pin_number
                #delegate_pin_number
                pc.username,
                rc.end_time,
                rc.duration_in_minutes,
                rc.billed_duration_in_minutes,
                rc.dnis_country_code,
                rc.dnis_number,
                rc.dnis_in_country_number,
                rc.dnis_name,
                rc.dnis_type,
                rc.is_wwa,
                rc.calling_number,
                rc.dnis_origin,
                rc.is_covered_by_bundle_allowance,
                rc.bundle_allowance_type,
                rc.bundle_allowance_id,
                pc.first_name,
                pc.last_name,
                pc.email,
                rc.pin_booking_chairman,
                rc.pin_booking_by
                FROM real_time_rating.pin_contact pc
                JOIN real_time_rating.rated_cdrs rc
                ON ( pc.pin_ref = rc.pin_ref )
                """
        if sql_where:
            sql_query += " WHERE" + " AND ".join(sql_where)
        cursor = self.conn.cursor()
        cursor.execute(sql_query, *sql_vars)
        result = cursor.fetchall()
        return dict(result)
    @dispatcher.add_method
    def get_summary_usage(self, service_ref, from_date, to_date):
        sql_where = []
        sql_vars = []
        if service_ref is not None:
            sql_where.append("pc.service_ref={}").format(service_ref)
            sql_vars.append(service_ref)
        if from_date is not None:
            sql_where.append("rc.start_time={}").format(from_date)
            sql_vars.append(from_date)
        if to_date is not None:
            sql_where.append("rc.end_time={}").format(to_date)
            sql_vars.append(to_date)
        # if excludeCallsCoveredByBundleAllowance is not None:
            # sql_where.append("excludeCallsCoveredByBundleAllowance={}").format(excludeCallsCoveredByBundleAllowance)
            # sql_vars.append(excludeCallsCoveredByBundleAllowance)
        sql_query = """
                SELECT
                rc.dnis_in_country_number,
                rc.dnis_country_code,
                rc.dnis_type,
                SUM(rc.duration_in_minutes),
                rc.call_charge,
                rc.rate_currency_code,
                rc.rate_per_minute
                FROM real_time_rating.pin_contact pc
                JOIN real_time_rating.rated_cdrs rc
                ON ( pc.pin_ref = rc.pin_ref )
                """
        if sql_where:
            sql_query += " WHERE" + " AND ".join(sql_where)
        cursor = self.conn.cursor()
        cursor.execute(sql_query, *sql_vars)
        result = cursor.fetchall()
        return dict(result)
    @Request.application
    def application(self, request):
        response = JSONRPCResponseManager.handle(request.data, dispatcher)
        return Response(response.json, response.http_status, mimetype='application/json')
if __name__ == '__main__':
    server = Server(Base)
    run_simple(HOST, PORT, server.application())
CLIENT
 import requests
import json
# from exeptions import EndPointConnection
class Client(object):
    def get_response(self):
        url = 'http://localhost:80'
        # headers = {'content-type': 'application/json'}
        data = {
            "jsonrpc": "2.0",
            "method": "get_detailed_usage",
            "params": [{"serviceRef": "1234", "fromDate": "2017-01-01 00:00:00", "toDate": "2017-01-31 23:59:59"}],
        }
        response = requests.get(url, data=json.dumps(data))
        # if int(response.status_code) == 200:
            # response.json()
        # else:
            # raise EndPointConnection('Endpoint "{}" not connected.\n\rHTTP-Error {}'.format(url, response.status_code))
        return response
if __name__ == "__main__":
    result = Client()
    print(result.get_response())
Запускаю клиент - получаю Response 200 и всё.

Отредактировано annie_shlepak (Март 6, 2017 16:21:33)

Офлайн

#6 Март 6, 2017 20:11:50

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Python JSON-RPC 2.0 API

Параметры передавайте не объектом а массивом.

Отредактировано ayb (Март 6, 2017 20:19:55)

Офлайн

#7 Март 7, 2017 18:24:24

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Python JSON-RPC 2.0 API

ayb прав, параметры передаются массивом, не по именам, а по позиции

 "params": ["1234", "2017-01-01 00:00:00", "2017-01-31 23:59:59"]

Ну и странное у вас понятие о минимальном запускаемом примере. Лишний метод get_detailed_usage, недостающий импорт handlers.base, запросы в базу. Как по вашему это можно быстро запустить и поискать ошибку?!



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Март 7, 2017 18:24:49)

Офлайн

#8 Март 10, 2017 13:50:03

annie_shlepak
Зарегистрирован: 2017-02-28
Сообщения: 4
Репутация: +  -1  -
Профиль   Отправить e-mail  

Python JSON-RPC 2.0 API

Проблема решена. Всем спасибо, кто откликнулся.

Офлайн

#9 Март 10, 2017 14:27:52

WoMax
Зарегистрирован: 2014-05-26
Сообщения: 124
Репутация: +  9  -
Профиль   Отправить e-mail  

Python JSON-RPC 2.0 API

annie_shlepak
Проблема решена. Всем спасибо, кто откликнулся.
и какое решение?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version