Автоматическое изменение частей кода при развертывании

#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 являются правдивыми. Поэтому не имеет значения, на что вы установили переменную среды.