没有项目描述

django-mysql-rds的Python项目详细描述


django mysql rds

一个django db后端,用于使用ssl db auth令牌连接到rds mysql实例。

使用

我建议你在加入之前先了解你在做什么以及为什么要这样做,但很可能你的数据库dict看起来像:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': DBNAME,
        'USER': USER,
        'PASSWORD': aws_client.generate_db_auth_token(HOST, PORT, USER),
        'HOST': HOST,
        'PORT': PORT,
        'OPTIONS': {
            'ssl': {
                'ca': 'certs/rds-cert.pem'
            }
        }
    }
}

您发现,大约15分钟后,您发出请求并接收Access Denied for user@instance,因为密码已过期。

此软件包允许您在连接时通过传递一个可调用的来生成密码:

def generate_pw():
    return aws_client.generate_db_auth_token(HOST, PORT, USER)

DATABASES = {
    'default': {
        'ENGINE': 'mysql_rds.backend',
        'NAME': DBNAME,
        'USER': USER,
        'PASSWORD': generate_pw,
        'HOST': HOST,
        'PORT': PORT,
        'CONN_MAX_AGE': 900,
        'OPTIONS': {
            'ssl': {
                'ca': 'certs/rds-cert.pem'
            }
        }
    }
}

我建议将CONN_MAX_AGE设置为900,因为生成的身份验证令牌将在900秒后过期。这可以确保重新创建需要刷新的连接。您可以将任何函数作为密码传递,并且将在连接时对其进行评估。对于本地测试,如果无法直接连接到rds,可以执行如下操作:

def generate_pw():
    return 'password'

安装

pip install django-mysql-rds

git clone git@github.com:cramshaw/django-mysql-rds.git

为什么?

当我在django中搜索使用ssl连接aws rds mysql实例的方法时,我找不到任何可以处理aws生成的db auth令牌将每15分钟过期这一事实的方法。

问题是,当设置模块中的任何内容发生更改时,django需要重新加载。这在运行时间长的web应用程序中不实用。我需要一种在连接时生成密码的方法。

怎么做?

仔细检查django.db.backends.mysql代码,可以清楚地看到DatabaseWrapper.get_connection_params方法接受设置dict,并将其转换为传递给mysql.connect的kwargs。我已经对此进行了子类化,并进行了扩展,以识别传入的密码是否是可调用的,如果是,则调用它并传递返回值。这会导致 Django每次创建连接时都会收到新密码。

DatabaseClient.settings_to_cmd_args中也会发生类似的事情,它用于转储和加载数据。在尝试创建run a shell之前,还对其进行了子类化和更改,以确保密码生成方法实际运行。

注意事项

虽然这对运行django==2.2的我有效,并且应该与内置mysql后端的工作完全相同,但没有任何保证。

我只需要这个为mysql工作。我还没有探索rds是否对postgres或其他数据库也有同样的作用,但同样的原则应该适用。

运行测试

测试需要安装https://pypi.org/project/mysqlclient/

python -m unittest tests/test*

包装

setup.py中的bump版本 然后:

rm -rf dist/
python3 setup.py sdist bdist_wheel
python3 -m twine upload dist/*

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java检查整数是0还是检查变量是null更好?   java Android Kotlin(初学者)使用File(),并从ACTION\u GET\u内容返回Uri   java JavaFx在“内部场景”和根场景之间切换   spring将XMLBean配置转换为java配置   java JPA HIBERNATE映射列两次(embeddedID和POJO)   c#单态模式模型在什么情况下适用?   java请求。getRemoteUser在特定时间后返回null?   spring boot中PUT api控制器的java my单元测试用例失败   java在字符串中互换地解析和替换值   java Android JNI在应用程序中检测到错误:调用JNI GetMethodID时出现挂起异常   JavaSpringDataMongo:使用非简单键持久化映射   爪哇玻璃鱼连接被拒绝   java如何在用户注册时发送特定电子邮件id的自动回复?   Java列表:实例化时和之后的赋值之间的差异