8

我想将 Django 连接到我的生产 MySQL 数据库(只读),以便我可以使用它来测试使用真实数据的分析应用程序。

有没有一种方法可以指定 django 应该通过 ssh 代理连接到数据库,就像 Sequel Pro 允许您使用用户名和密码指定通过特定的 SSH 代理连接一样?

如果是这样,DATABASES条目会是什么样子?

4

2 回答 2

20

只需使用 SSH 隧道。为了减轻您的工作,您可以安装autossh自动检查ssh连接是否存在并在连接断开时重新建立连接。

然后您可以使用以下命令打开隧道:

autossh -f -N -L LocalPort:MySQLAddress:MySQLPort your_login@your_server

在哪里:

  • your_server- 您通过 ssh 连接的服务器
  • your_login- 您的登录your_server
  • LocalPort- 运行 Django 的机器上任何未使用的端口。此端口将用于隧道。
  • MySQLAddress- 可以访问的 MySQL 服务器的地址your_server(也就是说,如果 MySQL 正在运行,your_server它将是127.0.0.1
  • MySQLPort- MySQL 正在监听的端口

然后在 Django 设置中,您将 MySQL IP 指定为上面设置127.0.0.1的端口LocalPort

一个例子:

autossh -f -N -L 10000:127.0.0.1:3306 a_user@192.168.1.3

当您运行此命令时,您将拥有一个监听本地端口 10000 的 SSH 隧道。因此,如果您连接到 localhost:10000,您的连接将通过隧道连接到 192.168.1.3 服务器上的 localhost:3306。

于 2013-05-15T15:30:33.093 回答
2

您还可以使用sshtunnel和以下变体直接在 Python 中执行 SSH 隧道:

import mysql.connector
import sshtunnel

sshtunnel.SSH_TIMEOUT = 5.0
sshtunnel.TUNNEL_TIMEOUT = 5.0

with sshtunnel.SSHTunnelForwarder(
    ('ssh.yourserver.com'),
    ssh_username='your SSH server username', ssh_password='secret1',
    remote_bind_address=('your database hostname', 3306)
) as tunnel:
    connection = mysql.connector.connect(
        user='your database username', password='secret2',
        host='127.0.0.1', port=tunnel.local_bind_port,
        database='your database name, e.g. yourusername$mydatabase',
    )
    # Do stuff
    connection.close()

来源:PythonAnywhere

于 2018-03-20T17:49:14.793 回答