在不重新启动服务器的情况下使 django 的设置缓存无效?

Eli*_*ert 5 database django caching multiple-databases uwsgi

我正在使用一个涉及多个数据库的 django 应用程序 - 即动态添加的多个数据库。每当有新客户注册时,我们都会为他们提供一个新数据库。设置文件可以动态加载这些(例如,我在服务器上运行一个 shell 脚本,并在不更改任何代码的情况下更新数据库定义 - 如果你真的很好奇如何,给我发消息),但由于 uwsgi/django 缓存设置,我必须撞 uwsgi 才能让新数据库得到认可。

关于强制 django 重新加载设置或使其设置缓存无效的任何建议?它可以来自命令行等。目前我正在使用 import settings 而不是来自,django.conf import settings因为过去它已经半工作,但我可以轻松切换回来。

谢谢!

ps - 如果答案是“你这个笨蛋,不要使用动态多个数据库”,那也没关系;)

Tom*_*cki 1

首先。如果你可以从多个数据库中退出,Django 仅在数据库列表固定的情况下才支持这一点。如果您可以为每个客户端提供单独的数据库,那么您可能可以为不同的客户端提供单独的 wsgi 进程(以及单独的数据库设置)。然后,您只需为新客户端生成新的 wsgi 进程,而无需修改设置。

如果您仍然想做您计划的事情,这里有一些提示:

动态重新加载设置不是一个选项。那里有很多问题。即使你与所有这些人战斗,他们也可能会在你意想不到的时候回来,你将花费数小时(如果不是数天)进行调试。

如果您的数据库设置一致(即所有客户端的密码和用户相同),您可以考虑使用 defaultdict 作为 DATABASES 变量。默认字典有工厂选项。你可以在工厂里有这样的东西:

def database_configuration_factory(name):
    # check if database exists (ie. raw SQL)

    return {
        'NAME': name,
        ...
    }
Run Code Online (Sandbox Code Playgroud)