0
0 комментариев

[apcode language=»python»]

import aiohttp
from aiohttp import web, WSCloseCode
import asyncio
import json
import requests
import argparse
 debug, rub, eur, usd = 0, 0, 0, 0
positive = ['1', 'true', 'True', 'y', 'Y']
 parser = argparse.ArgumentParser(description='Api_wallet')
parser.add_argument('--rub', default=0, type=float,
                    help='Value is rubles, defaul = 0')
parser.add_argument('--eur', default=0, type=float,
                    help='Value is eur, defaul = 0')
parser.add_argument('--usd', default=0, type=float,
                    help='Value is usd, defaul = 0')
parser.add_argument('--period', default=5, type=int,
                    help='Value is period, defaul = 5 sec')
parser.add_argument('--debug', default='1', type=str,
                    help='Value is debug, defaul = positive')
 args = parser.parse_args()
  async def api_wallet():
    global summa
    global usd
    global rub
    global eur
    i = False
    while True:
        r = requests.get('https://www.cbr-xml-daily.ru/daily_json.js')
        data = r.json
        data = json.loads(r.content)
        usd_r = data['Valute']['USD']['Value']
        eur_r = data['Valute']['EUR']['Value']
        usd_r_previous = data['Valute']['USD']['Previous']
        eur_r_previous = data['Valute']['EUR']['Previous']
        # Сумма в рублях и ее ограничение до двух знаков после запятой
        summa = args.rub + args.eur * eur_r + args.usd * usd_r
        summa = float('{:.2f}'.format(summa))
        # Курс usd-eur и его ограничение до двух знаков после запятой
        usd_eur = eur_r / usd_r
        usd_eur = float('{:.2f}'.format(usd_eur))
        # Сумма в долларах и ее ограничение до двух знаков после запятой
        summa_usd = args.rub / usd_r + args.usd + args.eur * usd_eur
        summa_usd = float('{:.2f}'.format(summa_usd))
        # Сумма в евро и ее ограничение до двух знаков после запятой
        summa_eur = args.rub / eur_r + args.eur + args.usd / usd_eur
        summa_eur = float('{:.2f}'.format(summa_eur))
        # Проверка, если изменился курс валюты, то дата обновилась и курс валюты изменился
        if i == False:
            time_stamp = data['Timestamp']
            i = True
        if time_stamp != data['Timestamp']:
            if (usd_r != usd_r_previous) or (eur_r != eur_r_previous):
                prin_console()
        # Вывод в консоль
        if args.debug in positive:
            print('usd = ' + str(usd_r))
            print('eur = ' + str(eur_r))
        else:
            print('start app')
            print('total budgets in rubles  = ' + str(summa))
            print('usd = ' + str(usd_r))
            print('eur = ' + str(eur_r))
         await asyncio.sleep(args.period)
  '''Вторая функция для возврата из нее значений, т.к. если возвращать значение из
первой, то она завершается и повтор вывода в консоль не происходит.'''
  async def api_wallet_get():
    global summa
    global usd
    global rub
    global eur
    while True:
        r = requests.get('https://www.cbr-xml-daily.ru/daily_json.js')
        data = r.json
        data = json.loads(r.content)
        usd_r = data['Valute']['USD']['Value']
        eur_r = data['Valute']['EUR']['Value']
        # Сумма в рублях и ее ограничение до двух знаков после запятой
        summa = args.rub + args.eur * eur_r + args.usd * usd_r
        summa = float('{:.2f}'.format(summa))
        # Курс usd-eur и его ограничение до двух знаков после запятой
        usd_eur = eur_r / usd_r
        usd_eur = float('{:.2f}'.format(usd_eur))
        # Сумма в доллорах и ее ограничение до двух знаков после запятой
        summa_usd = args.rub / usd_r + args.usd + args.eur * usd_eur
        summa_usd = float('{:.2f}'.format(summa_usd))
        # Сумма в евро и ее ограничение до двух знаков после запятой
        summa_eur = args.rub / eur_r + args.eur + args.usd / usd_eur
        summa_eur = float('{:.2f}'.format(summa_eur))
         return str(args.rub), str(args.usd), str(args.eur), str(summa), str(usd_r), str(eur_r), str(usd_eur), str(
            summa_usd), str(summa_eur)
 '''Функции GET, POST'''
async def rub_get(request):
    text_rub = await api_wallet_get()
    return web.Response(text=' rub = ' + text_rub[0],
                        content_type='text/plain')
  async def usd_get(request):
    text_usd = await api_wallet_get()
    return web.Response(text=' usd = ' + text_usd[1],
                        content_type='text/plain')
  async def eur_get(request):
    text_eur = await api_wallet_get()
    return web.Response(text=' eur = ' + text_eur[2],
                        content_type='text/plain')
  async def amount_get(request):
    text_summa = await api_wallet_get()
    return web.Response(text='rub: ' + text_summa[0] + '\n'
                                                       'usd: ' + text_summa[1] + '\n'
                                                                                 'eur: ' + text_summa[2] + '\n'
                             + '\n'
                               'rub - usd: ' + text_summa[4] + '\n'
                                                               'rub - eur: ' + text_summa[5] + '\n'
                                                                                               'usd - eur: ' +
                             text_summa[6] + '\n'
                             + '\n'
                               'sum: ' + text_summa[3] + ' rub / '
                             + text_summa[7] + ' usd / ' +
                             text_summa[8] + ' eur',
                        content_type='text/plain')
  # Запрос работает, но как с ним обращаться, пока не понимаю
async def post_set(request):
    if request.body_exists:
        data = await request.read()
        data = str(data)
         return web.Response(text=data[2:len(data) - 1],
                            content_type="text/plain")
  def create_runner():
    app = web.Application()
    app.add_routes([
        web.get('/rub/get', rub_get),
        web.get('/usd/get', usd_get),
        web.get('/eur/get', eur_get),
        web.get('/amount/get', amount_get),
        web.post('/post/set', post_set)])
    return web.AppRunner(app)
  async def start_server(host="127.0.0.1", port=8080):
    runner = create_runner()
    await runner.setup()
    site = web.TCPSite(runner, host, port)
    await site.start()
  # Задание № 5. Но как сравнить два значение того что уже выводилось в консоль и то что имеется пока непонятно.
async def prin_console():
    all_about_wallet = await api_wallet_get()
    print('start app_2')
    print('total budgets in rubles_2  = ' + all_about_wallet[0])
    print('usd_2 = ' + all_about_wallet[4])
    print('eur_2 = ' + all_about_wallet[5])
    await asyncio.sleep(60)
  if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(start_server())
    tasks = [asyncio.ensure_future(api_wallet()),
             asyncio.ensure_future(api_wallet_get()),
             asyncio.ensure_future(prin_console())]
    loop.run_until_complete(asyncio.wait(tasks))
    loop.run_forever()
    loop.close()

[/apcode]

Решенный вопрос
Добавить комментарий