我认为在最新版本的 Django 中有一个简单的答案,但我找不到它。
我有涉及数据库的代码。我希望它在 Django 每次启动时运行。我似乎有两个选择:
选项1。 AppConfig.ready()
- 这可以工作,但也可以在创建数据库表之前运行(即在测试期间或在没有数据的情况下重新初始化应用程序时)。如果我使用它,我必须捕获多种类型的异常并猜测原因是一个空数据库:
def is_db_init_error(e, table_name):
return ("{}' doesn't exist".format(table_name) in str(e) or
"no such table: {}".format(table_name) in str(e)
)
try:
# doing stuff
except Exception as e:
if not is_db_init_error(e, 'foo'):
raise
else:
logger.warn("Skipping updating Foo object as db table doesn't exist")
选项 2。 Use post_migrate.connect(foo_init, sender=self)
- 但这仅在我进行迁移时运行。
选项 3。老方法 - 从以下位置调用它urls.py
- 我不想让这样的事情发生urls.py
我想AppConfig
是唯一真正的道路
到目前为止我已经选择了选项 2 - 我不喜欢选项 1 和选项 3 中的臭味的 try/ except 东西让我烦恼urls.py
成为垃圾场。
然而,当我在本地开发时,选项 2 经常让我困惑——每当我想要运行初始化代码时,我都需要记住运行迁移。诸如拉取生产数据库或类似操作之类的事情通常会导致问题,因为迁移不会被触发。
我建议connection_created https://docs.djangoproject.com/en/2.2/ref/signals/#connection-created信号,即:
当数据库包装器与数据库建立初始连接时发送
数据库。如果您想发送任何帖子,这特别有用
连接到 SQL 后端的命令。
因此,当应用程序在应用程序周期开始时连接到数据库时,它将执行信号的代码。
它还可以在多个数据库配置中工作,甚至可以分离应用程序在初始化时建立的连接:
联系
已打开的数据库连接。这可以在多数据库配置中使用来区分连接信号
来自不同的数据库。
Note:
您可能需要考虑结合使用post_migrate https://docs.djangoproject.com/en/2.2/ref/signals/#post-migrate and connection_created
检查内部时发出信号AppConfig.ready()
如果发生迁移(例如标记激活post_migrate
信号):
from django.apps import AppConfig
from django.db.models.signals import post_migrate, connection_created
# OR for Django 2.0+
# django.db.backends.signals import post_migrate, connection_created
migration_happened = false
def post_migration_callback(sender, **kwargs):
...
migration_happened = true
def init_my_app(sender, connection):
...
class MyAppConfig(AppConfig):
...
def ready(self):
post_migrate.connect(post_migration_callback, sender=self)
if !migration_happened:
connection_created.connect(init_my_app, sender=self)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)