在部署时自动更改部分代码



我有一个小的Python flask项目,它使用SSH隧道访问托管在Pythonanywhere中的远程数据库。但是,在部署时(部署到也为数据库提供服务的服务器上),必须在没有SSH的情况下访问数据库。有没有人有什么技巧可以让代码"检测"到?如果代码是在服务器上运行还是在客户端上运行?代码如下所示。目前,我必须记住在部署之前更改onServer变量,使数据库仍然可以访问。

from flask import request, Flask, render_template, send_from_directory, url_for
from flask_sqlalchemy import SQLAlchemy
import sshtunnel
sshtunnel.SSH_TIMEOUT = 5.0
sshtunnel.TUNNEL_TIMEOUT = 5.0
app = Flask(__name__)
app.jinja_env.filters['zip'] = zip
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 1
onServer = 1
if onServer:
app.config['SQLALCHEMY_DATABASE_URI']='mysql://username:password@username.mysql.pythonanywhere-services.com/username$default'

else:
# SSH to pythonanywhere to get access to database
tunnel = sshtunnel.SSHTunnelForwarder(
('ssh.pythonanywhere.com'),
ssh_username='username',
ssh_password='password',
local_bind_address=("127.0.0.1",1000),
remote_bind_address=('username.mysql.pythonanywhere-services.com', 3306)
)
# Start SSH tunneling
tunnel.start()
app.config['SQLALCHEMY_DATABASE_URI']='mysql://username:password@127.0.0.1:{}/username$default'.format(tunnel.local_bind_port)
db = SQLAlchemy(app)

检测您是否在服务器上是环境检测的一个例子:确定您的脚本在什么环境中运行。

向脚本提供此信息的一种简单方法是使用环境变量。这些可以在您的服务器上设置,并在您的Python代码中使用os.environ获取。

您可以使用os.environ.get()获得给定的环境变量—如果当前环境中没有设置该变量,则将返回None

import os
>>> ON_SERVER = os.environ.get('ON_SERVER')
>>> ON_SERVER
>>> type(ON_SERVER)
<class 'NoneType'>

如果您愿意,可以将结果与None进行比较,以获得TrueFalse的值(尽管None已经是假的)。

>>> ON_SERVER = os.environ.get('ON_SERVER') is not None
>>> ON_SERVER
False

下面我在shell中设置了ON_SERVER环境变量——这里使用的是export(Linux/Unix/Mac),您可以看到结果

martin@MacBook ~ % export ON_SERVER=yes
martin@MacBook ~ % python3
Python 3.9.6 (default, Jun 29 2021, 06:20:32)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> ON_SERVER = os.environ.get('ON_SERVER') is not None
>>> ON_SERVER
True

在Python中,我现在被检测到在服务器上。因为设置环境变量。

请注意,所有环境变量都是字符串,Python中所有非空字符串都是true。因此,无论您将环境变量设置为什么都无关紧要。