没有项目描述
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/*