python - 在没有用户交互的情况下存储数据
问题描述
我想通过 Django 模型将网络设备数据存储Device
到我的数据库中。
工作流程
- 主机配置需要由用户在视图中设置(主机模型)
- 主机配置完成后,应扫描网络以查找设备(设备型号)
- 数据应存储在数据库中
问题:
仅当配置主机但不工作create_devices()
时才允许调用该功能。if Host.objects.values():
create_devices()
仅当存在一个主机模型时,如何才能调用该函数?- 在没有用户交互的情况下使用视图将动态和静态数据存储到数据库中是否正确?
楷模:
class Host(models.Model):
hostname = models.CharField(default="noads", max_length=6)
ipv4_address = models.GenericIPAddressField('IPv4')
ipv4_subnet = models.GenericIPAddressField('IPv4')
gateway = models.GenericIPAddressField('IPv4')
class Device(models.Model):
hostname = models.CharField(max_length=64)
mac_address = models.CharField(max_length=64)
ipv4_address = models.GenericIPAddressField('IPv4')
我的观点:
from webapp.models import Host, Device
from django.views import View
from django.views.generic.detail import DetailView
import multiprocessing.dummy
import multiprocessing
def create_devices():
"""
Creates DB entry of devices if they dont already exist
:return: List of mulitple devices stored in objects
:rtype: list ["Device", "Device", ...]
"""
available_devices = get_available_devices_in_list()
arp_table_of_all_hosts = get_arp_table_linux()
dev_list = []
for deviceip in available_devices:
#If device already exists in DB continue
if arp_table_of_all_hosts.get(deviceip):
if arp_table_of_all_hosts[deviceip] in Device.objects.filter(mac_address = arp_table_of_all_hosts[deviceip]):
continue
else:
devmac = arp_table_of_all_hosts[deviceip]
devname = "unknown" #socket.gethostbyaddr(deviceip)
dev = Device(hostname=devname, mac_address=devmac, ipv4_address=deviceip)
dev.save()
dev_list.append(dev)
return dev_list
class DeviceGetAll(DetailView):
if Host.objects.values():
create_devices()
model = Device
pass
解决方案
你的观点DeviceGetAll
写得不正确。if
条件需要放在视图的某些方法中,而不是在类定义中。
我不明白你到底想做什么,所以我不知道你需要在哪种方法中添加代码,但你可以查看基本代码,DetailView
看看其中一些方法是否对你有用。我什至不知道,详细视图是否是放置创建相同模型实例的代码的最佳位置;也许它也可以在创建主机之后进行。
但是,如果您想使用DetailView
,例如,您可以覆盖get_object()
来自SingleObjectMixin
(它是 的父级之一DetailView
)的方法,您的代码可能如下所示:
class DeviceGetAll(DetailView):
model = Device
def get_object(self, *args, **kwargs):
if Host.objects.exists():
create_devices()
obj = super().get_object(*args, **kwargs)
return obj
此外,您可能的意思是.exists()
在 if-condition 中使用该方法而不是.values()
.
推荐阅读
- shell - 无法获取唯一列值
- aframe - Aframe 0.8 中初始相机旋转的方向不正确
- javascript - 修复挂板上的数字图像而不会失去响应能力
- php - NULL,0,False和''之间的区别?
- java - 当所有字段(包括分隔符,但不包括年份)都是可选的时,在 Java8 中解析 ISO 8601 日期
- r - R 不支持从“CP1,254”到“”的转换
- node.js - 在 pre 'save' 和 pre 'findOneAndUpdate' 钩子中的 Mongoose 插件更改不会被持久化
- php - PHP Store变量没有回显?
- sql - 我可以在 SQL 表的字段中存储超过 8000 个字符吗?
- facebook - 如何使用图形 API 从 Facebook 页面检索工作申请