Python/Django:我需要一些代码在请求之间运行,需要寻找哪个概念?

Python/Django:我需要一些代码在请求之间运行,需要寻找哪个概念?,python,django,Python,Django,我正在为我的项目尝试Django,它包含服务器端代码,可以在请求之间工作。它应该在服务器启动、保持状态时初始化,有时在HTTP请求之间轮询 我可以用pythonhttp.server编写自己的服务器,但目前看来似乎有些过分,简单(Django内置http)服务器现在适合我的项目。对于典型的Django项目,哪种是实现服务器端代码的最简单方法 编辑:因此我正在寻找类似的内容: # my_serverside_module.py # keep during server lifetime stat

我正在为我的项目尝试Django,它包含服务器端代码,可以在请求之间工作。它应该在服务器启动、保持状态时初始化,有时在HTTP请求之间轮询

我可以用pythonhttp.server编写自己的服务器,但目前看来似乎有些过分,简单(Django内置http)服务器现在适合我的项目。对于典型的Django项目,哪种是实现服务器端代码的最简单方法

编辑:因此我正在寻找类似的内容:

# my_serverside_module.py

# keep during server lifetime
state = [] 

# called at server start
def init_module(): pass 

# called by framework 1 time per minute
def poll(): pass 

# called by myself during http request from Django code
def do_something(): pass

Django中间件框架正是您所需要的

请检查我的服务器端模块.py 在服务器生存期内保留 状态=[] 答:这可以使用芹菜(python变量中的存储状态)和/或redis(内存中的存储状态,即redis)实现。您可以使用redis和django中间件/from视图来使用芹菜任务更新状态

在服务器启动时调用 def init_模块():通过 答:这也可以用芹菜来实现。或 django项目中主应用程序的apps.py文件中应用程序的就绪功能

框架每分钟调用1次 def poll():通过 答:据我所知,django,到目前为止,我从未遇到过这样的事情。这并不意味着这件事做不到:P我不知道这个问题的答案

但使用芹菜,你可以每分钟调用一个函数/任务。它不会被django调用,但它会被每分钟调用

在Django代码的http请求期间由我自己调用 def do_something():通过 答:这绝对是中间件部分,更多信息请参见中间件挂钩。编写一个实用函数并从中间件钩子调用它。 如果您希望在调用view函数之前或之后发生某些事情,那么中间件挂钩非常有用


如果希望在处理视图期间调用函数,可以使用django中的signals概念。您可以在使用python代码处理视图的过程中发送信号

您所描述的类似于cron作业或计划任务

在Django中有多种方法可以解决这个问题。是一种广泛使用的分布式任务队列,也支持

另一种可能性是,如果一个更简单的解决方案适合您的需要,可以使用Github上提供的开源项目。示例:


    • 您有两种选择

      选项1:服务器端进程

      每个django应用程序都可以注册代码,以便在通过启动时调用。如果您想启动一些后端轮询/计算线程和模块,您可以在这里进行。请记住,考虑到(a)多进程编程和(b)处理WSGI请求的多种方法(单线程、gevent、多进程、多线程)以及您处于分布式环境中,这会变得非常复杂。主机、进程、线程等之间的一致性是否重要

      选项2:任务

      正如另一个答案所指出的,这就是异步工作者的闪光点。像这样的东西就是为此而设计的,并且很好地集成在一起。在我看来,这是解决问题的正确方法


      我知道这个答案有点重复Chetan的答案,但我希望它能更清楚一点。

      在生产中,任何Django应用程序都会运行多个服务器进程,所以这里的关键问题是在哪里保持状态以及如何在进程之间共享状态

      根据您的需求,您可能可以将状态保存在SQL数据库或像Redis这样的内存备份数据库中。在这种情况下,您可以在
      AppConfig.ready
      中调用
      init_module()
      ,并使用Celerybeat或Cron执行
      poll()
      ,其他人建议了这一点。请注意,
      init_module()
      将在每个服务器进程中调用一次。如果这是一个问题,那么您必须实现某种类型的锁定,或者使用单独执行的Django管理命令


      如果您的状态必须作为Python数据结构存储在内存中,那么单独的单进程Python服务器实际上可能是您唯一的选择。请注意任何缩放问题。轮询可以用一个线程实现,但是用Celerybeat或Cron从外部触发它也可以

      在请求之间运行是什么意思?它会钩住随机请求并添加更多数据?或者?我想是计划好的任务。也许我没有那么清楚。代码不应在请求之间(之前/之后)工作,而应独立于请求,因此它在服务器生命周期内执行自己的任务,http请求在执行时要求它执行某些操作。然后它肯定是计划任务-看看,它允许您创建异步任务,您可以在任何地方触发这些任务,并创建定期任务STHX,但似乎不是我要找的。若我做得很好,中间件在请求之前/之后运行,但我的代码应该独立于请求工作,它应该被初始化,并在服务器生存期内保持其状态。