Django中的动态每请求数据库连接

1 投票
2 回答
1120 浏览
提问于 2025-04-16 22:01

我正在构建一个集中式的Django应用,这个应用会和多个动态数量的数据库进行交互,这些数据库的结构基本上是一样的。这些数据库还被一些老旧的应用使用,其中有些是用PHP写的。为了避免存储多个数据库凭证的麻烦,我们决定把这些信息放在应用外面的通用设置文件里。这样,设置文件可以在不重启Django应用的情况下被创建、修改或删除。

每次请求Django应用时,都会有一个HTTP头或者一个URL参数,这些可以用来判断应该查看哪个设置文件,从而确定使用哪个数据库的凭证。

我最初的想法是使用一个自定义的Django中间件,这个中间件可以解析设置文件(可能还会有缓存),并在每次请求时创建一个新的连接对象,然后把它放入django.db中,以便在进行任何ORM操作之前使用。

有没有更优雅的方法来处理这种情况?使用中间件的方式会不会有线程安全的问题需要考虑?

2 个回答

0

你可以用不同的 settings.py 文件启动不同的实例(通过设置不同的 DJANGO_SETTINGS_MODULE),并且在不同的端口上运行,然后把请求引导到特定的应用上。这只是我个人的一点建议。

2

每次重新读取文件的代价很高,尤其是当文件不太可能发生变化的时候。

我通常的做法是使用INotify来监控配置文件的变化,而不是在每次请求时都去读取文件。此外,我会保持一个“当前”的配置,这个配置是从文件中解析出来的,只有在我完成解析并确认它是有效的之后,才会用新值替换掉它。你可以通过在每个请求到来时设置当前配置来解决一些关于线程安全的问题,这样配置在请求进行中就不会改变了。

撰写回答