#python #flask
Вопрос:
У меня есть небольшой проект 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)
Комментарии:
1. несколько вариантов, но все сводится к тому, как вы отличаете сервер от клиента. может быть так же просто, как файл конфигурации/информация, которая находится на сервере.
2. Возможно, даже простая переменная среды, такая как
ON_SERVER=1
на сервере, также сделает свое дело.
Ответ №1:
Определение того, находитесь ли вы на сервере, является примером определения среды: определение среды, в которой выполняется ваш сценарий.
Простой способ предоставить эту информацию вашему сценарию-использовать переменные среды. Их можно установить на вашем сервере и использовать в вашем коде Python os.environ
.
Вы можете получить заданную переменную среды с помощью os.environ.get()
— это вернет None
значение, если переменная не задана в текущей среде.
import os
>>> ON_SERVER = os.environ.get('ON_SERVER')
>>> ON_SERVER
>>> type(ON_SERVER)
<class 'NoneType'>
Вы можете сравнить результат с None
, чтобы получить True
False
значение или, если хотите (хотя None
это уже неверно).
>>> ON_SERVER = os.environ.get('ON_SERVER') is not None
>>> ON_SERVER
False
Ниже я задаю переменную 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 являются правдивыми. Поэтому не имеет значения, на что вы установили переменную среды.