#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. Хорошо, это дало мне представление о других альтернативах. Спасибо