Данные Django не вставляются в postgresql

#python #django #postgresql #flask

#python #django #postgresql

Вопрос:

Этот код получает показания производительности системы с помощью flask и отображает их на веб-странице Django с использованием диаграммы, которая обновляется каждую секунду. Я пытаюсь сохранить данные в postgresql, однако это не работает. Данные не вставляются в таблицу, которая была создана в базе данных.

views.py

 from django.shortcuts import render
import requests
from django.http import HttpResponse, request
from .models import Usage


def monitor(request):
    url = "http://127.0.0.1:5000/stats"
    data = requests.get(url)
    print(data.text)
    data2 = data.text
    return render(request, "home.html", {'alldata': data2})


def cpu_monitor(request):
    url = "http://127.0.0.1:5000/cpu"
    cpu_data = requests.get(url)
    cpu_data2 = cpu_data.json()

    for key in cpu_data2:
        cpu = cpu_data2['CPU']
        time = cpu_data2['Time']
        print(cpu)
        print(time)
        val = key

    return render(request, "chart.html", {'data': val})


def cp(request):
    url = "http://127.0.0.1:5000/cpu"
    cpu_data = requests.get(url)
    cpu_data2 = cpu_data.json()

    for key in cpu_data2:
        cpu = cpu_data2['CPU']
        time = cpu_data2['Time']
        print(cpu)
        print(time)
        val = [cpu]

    return HttpResponse(val)


def mm(request):
    url = "http://127.0.0.1:5000/memory"
    memory_data = requests.get(url)
    memory_data2 = memory_data.json()

    for key in memory_data2:
        memory = memory_data2['Memory Percentage']
        time = memory_data2['Time']
        print(memory)
        print(time)
        mem = [memory]

    return HttpResponse(mem)


def dk(request):
    url = "http://127.0.0.1:5000/disk"
    disk_data = requests.get(url)
    disk_data2 = disk_data.json()

    for key in disk_data2:
        disk = disk_data2['Used Partition']
        time = disk_data2['Time']
        print(disk)
        print(time)
        dsk = [disk]

    return HttpResponse(dsk)


def dkf(request):
    url = "http://127.0.0.1:5000/diskfree"
    free_disk_data = requests.get(url)
    free_disk_data2 = free_disk_data.json()

    for key in free_disk_data2:
        free_disk = free_disk_data2['Free Partition']
        time = free_disk_data2['Time']
        print(free_disk)
        print(time)
        dskf = [free_disk]

    return HttpResponse(dskf)


def ib(request):
    url = "http://127.0.0.1:5000/inb"
    ib_data = requests.get(url)
    ib_data2 = ib_data.json()

    for key in ib_data2:
        ibn = ib_data2['Received Bytes']
        time = ib_data2['Time']
        print(ibn)
        print(time)
        ibd = [ibn]

    return HttpResponse(ibd)


def ob(request):
    url = "http://127.0.0.1:5000/oub"
    ob_data = requests.get(url)
    ob_data2 = ob_data.json()

    for key in ob_data2:
        obn = ob_data2['Received Bytes']
        time = ob_data2['Time']
        print(obn)
        print(time)
        obd = [obn]

    return HttpResponse(obd)


def insert():
    sysMon = Usage
    sysMon.cpu = cp(request)
    sysMon.memory = mm(request)
    sysMon.freeDisk = dk(request)
    sysMon.usedDisk = dkf(request)
    sysMon.inbound = ib(request)
    sysMon.outbound = ob(request)
    sysMon.save()

  

models.py

 from django.db import models


class Usage(models.Model):

    cpu = models.CharField(max_length=200, null=True)
    memory = models.CharField(max_length=200, null=True)
    freeDisk = models.CharField(max_length=200, null=True)
    usedDisk = models.CharField(max_length=200, null=True)
    inbound = models.CharField(max_length=200, null=True)
    outbound = models.CharField(max_length=200, null=True)
  

Любая помощь будет высоко оценена.

Комментарии:

1. Вы определили метод insert, который может сохраняться в базе данных, но вы никогда не вызываете этот метод (по крайней мере, не в показанном вами коде)

2. @jdoer1997 Я также пробовал использовать функцию возврата, но ничего не происходит

Ответ №1:

Получите ясность о типе данных каждой функции. Функция просмотра возвращает данные типа HttpResponse. Вы должны изменить свои функции данных так, чтобы каждая из них возвращала данные требуемого типа, а не возвращала HttpResponse. Например, функция mm должна возвращать данные памяти, которые в вашей модели являются символьным полем (это текст с ограничением в 200 символов). Убедитесь, что он возвращает текст, а не список Python, не json и не HttpResponse.

Затем вызовите одну функцию просмотра, которая соберет (из всех функций данных) и сохранит ее, прежде чем возвращать свой HttpResponse. Например:

 #Data function. Returns the disk free data itself, not a HttpResponse
def dkf():
    url = "http://127.0.0.1:5000/diskfree"
    free_disk_data = requests.get(url).json()
    #other disk processing to be written by you. dskf is a variable with Character (text) data.  How to get it is left to you
    return dskf

#Data function. Returns the memory data itself, not a HttpResponse
def mm():
    url = "http://127.0.0.1:5000/memory"
    memory_data = requests.get(url).json()
    #other memory processing to be written by you.  mem is a variable with Character (text) data.  How to get it is left to you
    return mem


#View function.  Call in the browser as /insert
def insert(request):
    sysMon = Usage
    sysMon.memory = mm()     #calls mm function which returns memory data
    sysMon.freeDisk = dkf()  #calls dkf function which returns disk free data
    #call the other ones here
    sysMon.save()

    return HttpResponse("Usage data saved")
  

Также обратите внимание, что для сбора данных и сохранения в базе данных вам не обязательно использовать представление (для которого требуется браузер и пользователь для загрузки страницы). Вы можете создать скрипт Python, который загружает модули Django, и выполнять сбор данных из серверной части, например, периодически вызываемой из cron (в Linux) или планировщика задач Windows.

Комментарии:

1. Спасибо, но что мне следует использовать вместо или CharField, если я хочу вставить список вместо текста. В настоящее время возвращаемый тип данных представляет собой список.

2. Это связано с дизайном вашей базы данных и является совершенно новым вопросом. Но если вы хотите отслеживать производительность сервера с течением времени, вам следует добавить DateTimeField в класс использования (и в базу данных). Если у вас есть это, вы можете взять только последний элемент из каждого списка, чтобы запись об использовании содержала запись cpu, mem, disk и т.д. Для этого конкретного момента. Таким образом, вам не нужно вставлять список, поскольку список таких значений, не соответствующих какой-либо дате-времени, вероятно, не очень полезен для чего-либо.

3. Хорошо, это дало мне представление о других альтернативах. Спасибо