保存模型后创建http请求

时间:2019-07-18 11:06:52

标签: python django django-models

我已经在python中做了一个ip +端口检查器,但是我想用django使其成为一个网站,一切都还可以,但是我有一些问题,我不知道如何制作,所以它没有创建一个无限循环,如果将1000个ip +端口添加到数据库中,我不希望它一次建立1000个连接。

我没有尝试太多,因为我不知道该怎么做。 我尝试使用from concurrent.futures import ThreadPoolExecutor并将max_workors设置为10,因此它一次只能进行10个连接,但这虽然可行,但仍然存在邀请循环的问题。

模型保存功能

def save(self, *args, **kwargs): # overwrite save function
    super().save(*args, **kwargs) # saves to database
    checker.check(self) # calls check function

checker.py中的检查功能

def check(modelthing):
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((self.ip, self.port))
        modelthing.is_alive = True # sets is_alive to true if everything went ok
    except:
        modelthing.is_alive = False # sets is_alive false when exception is thrown
    modelthing.save() # ISSUE it saves the model again and it calls the save function that calls checker.check(self) witch creates an infinity loop

将其保存到数据库,调用检查功能。 (第一段代码) 然后,它检查ip +端口是否仍然有效。 (第二个代码块),最后一行再次保存它,女巫调用了第一个代码块,然后该块再次调用了checker函数,并一遍又一遍地重复。

我不知道这是否是最好的方法,但我设法使其与ThreadPoolExecutor一起使用,虽然解决了第二个问题,但仍然会产生无限循环。

2 个答案:

答案 0 :(得分:0)

您可以使用依赖注入,在call_check中传递一个附加的关键字参数(例如save),以决定是否需要再次调用checker.check(self):< / p>

def save(self, *args, call_check=True, **kwargs):
    super().save(*args, **kwargs)
    if call_check:
        checker.check(self)

然后在checker.check中将参数值传递为False

def check(modelthing):
    ...
    ...
    modelthing.save(call_check=False)

答案 1 :(得分:0)

一种解决方案是从checker.check(self)函数中删除save,然后在保存对象后分别调用它。

因此,在您的应用程序代码中,您可以执行以下操作:

  1. modelthing.save()
  2. modelthing.check()