Django使用SSH隧道连接数据库

4

有没有Python本地方式通过SSH隧道连接Django到数据库的方法?我看到有人在主机上使用SSH端口转发,但我更希望一个可以轻松容器化的解决方案。

1个回答

12

这很顺畅。

要求: sshtunnelhttps://github.com/pahaz/sshtunnel

  1. 在django的settings.py中,在django DB设置块之前创建一个SSH隧道:
from sshtunnel import SSHTunnelForwarder

# Connect to a server using the ssh keys. See the sshtunnel documentation for using password authentication
ssh_tunnel = SSHTunnelForwarder(
    SERVER_IP,
    ssh_private_key=PATH_TO_SSH_PRIVATE_KEY,
    ssh_private_key_password=SSH_PRIVATE_KEY_PASSWORD,
    ssh_username=SSH_USERNAME,
    remote_bind_address=('localhost', LOCAL_DB_PORT_ON_THE_SERVER),
)
ssh_tunnel.start()
  1. 然后在settings.py中添加DB信息块。这里我正在添加一个默认的本地DB和远程DB,我们使用ssh隧道连接到它
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'HOST': NORMAL_DB_HOST,
        'PORT': NORMAL_DB_PORT,
        'NAME': NORMAL_DB_NAME,
        'USER': NORMAL_DB_USER,
        'PASSWORD': NORMAL_DB_PASSWORD,
    },
    'shhtunnel_db': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'HOST': 'localhost',
        'PORT': ssh_tunnel.local_bind_port,
        'NAME': REMOTE_DB_DB_NAME,
        'USER': REMOTE_DB_USERNAME,
        'PASSWORD': REMOTE_DB_PASSWORD,
    },
}

就是这样。现在可以使用命令进行到远程数据库的迁移,例如$ python manage.py migrate --database=shhtunnel_db或者通过类似于Models.objects.all().using('shhtunnel_db')的代码在Python中调用数据库。

额外信息: 在我的情况下,远程数据库是由别人创建的,我只想读取它。为了避免编写模型并停用模型管理器,我使用以下Django命令从数据库中获取模型[src]:

python manage.py inspectdb

请提供一个“default”数据库连接的示例,我想通过SSH隧道将Django的“default”数据库连接到远程数据库。 - souravjamwal77
我猜在“default”键下使用ssh隧道数据库配置应该能按预期工作。 - Charalamm
@DavidHenson 你能否使用与pg4admin或类似软件相同的输入连接到数据库? - Charalamm
太好了!它在MS-Windows上运行。我无法通过域名连接到SSH服务器,只能使用IP地址。 - SuB
它托管在PyPI上,使用pip install sshtunnel来安装它。 - SuB
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接