Как отправить POST-запрос в виде словаря на мой flask основной сервер - PullRequest
0 голосов
/ 05 апреля 2020

ОК, поэтому я делаю проект по поиску сведений о работоспособности удаленного сервера с помощью python, и я размещаю основной сервер с помощью flask. Но все равно, как отправить отчет о работоспособности, который я создал с помощью python, в приложение flask. Отчет о работоспособности представлен в виде словаря, и мне нужно передать значения словаря в столбцы, являющиеся ключами словаря в моей базе данных. Кто-нибудь может мне помочь с отправкой отчета о работоспособности в приложение Flask? Этот отчет о работоспособности находится в другой системе, и мне нужно отправить его на мой главный сервер.

import psutil
import time
import json
import requests

'''
This program will be loaded on to the target server.
A flask app will transmit health data to the main flask app.
''' 

SERVER_NAME="test_local_server"

def getHealth():  # function for generating health report. Returns a json object.
    print('generating health report')
    report={}
    report['sever_name']=SERVER_NAME
    report['cpupercent']=psutil.cpu_percent(interval=2.0)
    report['ctime']=psutil.cpu_times()
    report['cpu_total']=report['ctime'].user+report['ctime'].system    
    report['disk_usages']=psutil.disk_usage("/")
    report['net']=psutil.net_io_counters()
    report['bytes_sent']=report['net'].bytes_sent
    report['bytes_received']=report['net'].bytes_recv
    report['packets_sent']=report['net'].packets_sent
    report['packets_received']=report['net'].packets_recv
    report['mem']=psutil.virtual_memory()
    report['memory_Free']=report['mem'].free
    json_report=json.dumps(report)
    return(json_report)

if __name__=='__main__':
    print(f'starting health report stream for server :\t{SERVER_NAME}')
    while True:
        getHealth()

Это код для создания сведений о работоспособности. Как отправить его обратно в мое приложение flask в форма словаря?

1 Ответ

0 голосов
/ 05 апреля 2020

Клиент

Я бы начал с того, чтобы несколько упростить этот код:

import psutil

STATS_URL = 'http://localhost:5000/'
SERVER_NAME="test_local_server"

def get_health(): 

    print('generating health report')

    cpu_percent = psutil.cpu_percent(interval=2.0)
    cpu_times = psutil.cpu_times()
    disk_usage = psutil.disk_usage("/")
    net_io_counters = psutil.net_io_counters()
    virtual_memory = psutil.virtual_memory()    

    # The keys in this dict should match the db cols
    report = dict (
        sever_name = SERVER_NAME
        ctime = cpu_times.__str__(),
        disk_usages = disk_usage.__str__(),
        net = net_io_counters.__str__(),
        mem = virtual_memory.__str__(),

        cpupercent = cpu_percent,
        cpu_total = cpu_times.user + cpu_times.system,
        bytes_sent = net_io_counters.bytes_sent,
        bytes_received = net_io_counters.bytes_recv,
        packets_sent = net_io_counters.packets_sent,
        packets_received = net_io_counters.packets_recv,

        memory_Free = virtual_memory.free,
        )

    return report

Эта get_health функция создает и возвращает report словарь. Обратите внимание, что для некоторых возвращаемых значений из функций psutil я использовал встроенный метод __str__. Это гарантирует, что дружественный тип будет вставлен в базу данных.

Если вы хотите проверить типы самостоятельно, вы можете сделать что-то вроде:

for item in report:
    print (item, type(report[item]), report[item])

Далее запустите эту функцию в al oop, с желаемой задержкой между запросами:

if __name__=='__main__':

    import time
    import requests

    print(f'starting health report stream for server :\t{SERVER_NAME}')

    while True:
        report = get_health()
        r = requests.post(STATS_URL, json=report)
        print (r, r.json())
        time.sleep(1)

Обратите внимание, что для аргумента json используется значение request.post, которое автоматически устанавливает правильный тип содержимого, который Flask 'request.get_json функция ожидает.

Сервер

Это довольно легко получить:

from flask import Flask, request
app = Flask(__name__)

@app.route('/', methods=['POST'])
def index():
    incoming_report = request.get_json()

    add_to_db(incoming_report) # We'll build this in a sec.

    return {'message': 'success'}

Теперь вы можете работать с incoming_report, который является словарем.

Это также отправляет сообщение об успехе обратно клиенту, поэтому на клиенте вы увидите выход:

starting health report stream for server :  test_local_server
generating health report
<Response [200]> {'message': 'success'}
# Repeats until killed

База данных

, и мне нужно передать значения словарь в столбцы, которые являются ключами словаря в моей базе данных

Теперь, когда у вас есть словарь incoming_report, будет легко добавить его в вашу базу данных, если вы используете ORM.

Что-то вроде этот ответ Шоу Я позволю вам просто распаковать этот словарь. Таким образом, предполагая, что ваша модель называется Report, вы можете просто сделать что-то вроде:

def add_to_db(d):
    report  = Report(**d)
    db.session.add(report)
    db.session.commit()

Обратите внимание, что это может использовать некоторую проверку и аутентификацию, если ваше развертывание требует этого.

...