将Django连接到代理服务器后面的数据库

时间:2013-05-15 13:52:12

标签: mysql django

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

有没有办法指定django应该通过ssh代理连接到db,就像Sequel Pro允许你指定通过特定的SSH代理用用户名和密码连接一样?

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

2 个答案:

答案 0 :(得分:15)

只需使用SSH隧道。为了简化您的工作,您可以安装autossh,它会自动检查ssh连接是否处于活动状态,并在其关闭时重新建立连接。

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

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

其中:

  • your_server - 您通过ssh连接的服务器
  • your_login - 您在[{1}}
  • 上的登录信息
  • your_server - 运行Django的计算机上任何未使用的端口。该端口将用于隧道。
  • LocalPort - MySQL服务器的地址,因为它可以从MySQLAddress访问(也就是说,如果MySQL在your_server上运行,它将是your_server
  • 127.0.0.1 - MySQL正在侦听的端口

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

一个例子:

LocalPort

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

答案 1 :(得分: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