【问题标题】:Django connection with an Auto-rotate password DB带有自动轮换密码数据库的 Django 连接
【发布时间】:2019-03-26 06:22:12
【问题描述】:

我有一个运行良好的Django 应用程序。它连接到托管在云上的MySQL 服务器。

出于安全原因,MySQL 服务器设置为每 30 天自动轮换一次密码。 Django 只能在使用我开发的自定义函数加载settings.py 时访问新密码(将从AWS Secrets Manager 获取新密码)。

我正在寻找一种方法让Django 检测连接是否有问题,然后更新对用户透明的密码。

这可能吗?

【问题讨论】:

    标签: python mysql django passwords


    【解决方案1】:

    我能想到的选项:

    1. 您可以使用自定义中间件在每次请求之前检查连接。
    2. 您可以使用cron 作业定期检查失败的数据库连接,并在发现此类失败时更新设置。

    要检查连接,您可以使用方法django.db.connection.ensure_connection()。如果您查看this answer,您可以尝试这样的操作:

    from django.db import connection
    from django.db.utils import OperationalError
    
    class Command(BaseCommand):
        def handle(self, *args, **options):
            try:
                # if this succeeds, no further action is needed
                connection.ensure_connection()
            except OperationalError:
                # update the DB password and try again
    

    【讨论】:

    • 我尝试了选项 1,它奏效了。但是,当数据库密码不正确时,通过中间件的第一个请求用户会收到拒绝访问错误。当用户刷新页面时,它会提供预期的结果。有什么想法吗?
    • 您的自定义中间件在MIDDLEWARE列表中的哪个位置?也许在调用您的中间件之前另一个中间件正在访问数据库?
    • 抱歉,它正在工作。这是我在 Django 中的第一个中间件,我有一行:response = self.get_response(request) 作为代码的第一行。就我而言,我将它移到代码的末尾并完美地工作。中间件顺序上,原来是第一个。
    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多