【问题标题】:Where should I place the one-time operation operation in the Django framework?django框架中的一次性操作操作应该放在哪里?
【发布时间】:2009-12-31 16:38:20
【问题描述】:

我想执行一些一次性操作,例如启动后台线程并每 30 分钟填充一次缓存作为 Django 服务器启动时的初始化操作,因此它不会阻止用户访问该网站。我应该将所有这些代码放在 Django 中的什么位置?

  • 将它们放入setting.py 文件中不起作用。看来会造成循环依赖。
  • 将它们放入__init__.py 文件不起作用。 django服务器多次调用(是什么原因?)

【问题讨论】:

  • 指的是__init__.py,每次你导入那个模块或者服务器重新加载它时都会调用它。

标签: python django


【解决方案1】:

我只是创建独立脚本并使用 cron 安排它们。诚然,它的技术含量有点低,但它确实有效。只需将其放在项目顶级目录中的脚本顶部并根据需要调用即可。

#!/usr/bin/env python
from django.core.management import setup_environ
import settings
setup_environ(settings)
from django.db import transaction

# random interesting things
# If you change the database, make sure you use this next line
transaction.commit_unless_managed()

【讨论】:

  • 我认为如果你使用 cron 作业,使用 celery 会更好。
  • @diegueus9:好的,为什么芹菜更好吃?具体来说?我用谷歌搜索了一下,似乎……还没有准备好迎接黄金时段。当我为生产做事时,我变得非常保守。我见过太多精彩的 Next Great Things,但不知何故未能满足我的期望。 Cron 对新用户来说可能是粗略/神秘的,但我已经使用了 20 年,而且它坚如磐石。这就是我在生产中想要的。
  • @peter 恕我直言,我认为,因为:1)是 django 的应用程序 2)Celery 有一个任务队列,cron 没有。 3)可能是因为所有操作系统中都没有 cron。 4) 我认为 cron celeryproject.org/introduction.html#features 有很多功能很难。 5) 我认为 celery 的架构客户端/服务器和工作人员比 cron 工作更强大。顺便说一句,对不起我的英语不好。
【解决方案2】:

我们将一次性启动脚本放在顶级urls.py 中。这通常是您的管理员绑定所在的位置——它们也是一次性启动的。

有些人喜欢将这些东西放在settings.py 中,但这似乎将设置(没有多大作用)与网站的其余代码(有作用)混为一谈。

【讨论】:

  • 我尝试将init方法放入urls.py,但似乎在任何访问之前都不会调用它
【解决方案3】:

对于启动服务器中的一项操作,您可以使用customs commands,或者如果您想要一个周期性任务或任务队列,您可以使用celery

【讨论】:

    【解决方案4】:

    __init__.py 将在每次导入应用程序时调用。因此,如果您将 mod_wsgi 与 Apache 一起使用,例如使用 prefork 方法,那么创建的每个新进程都会有效地“启动”项目,从而导入 __init__.py。听起来你最好的方法是创建一个新的管理命令,然后如果可以的话,每隔一段时间运行一次。要么,要么在启动服务器之前运行该管理命令。例如,您可以编写一个运行该管理命令的快速脚本,然后启动服务器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 2020-03-28
      • 2011-02-28
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      相关资源
      最近更新 更多