#python #mysql
#python #mysql
Вопрос:
Я просмотрел эту ошибку, и они говорят, что это как-то связано с адресом привязки, я прокомментировал эту строку и все равно получаю эту ошибку. Кроме того, когда я пингую сервер, пакеты не принимаются. Я не знаю, что еще делать.
def create_app():
app = Flask(__name__)
app.config.from_mapping(
SECRET_KEY = "***",
DATABASE_HOST=os.environ.get('****.cleardb.com'),
DATABASE_PASSWORD=os.environ.get('***'),
DATABASE_USER=os.environ.get('***'),
DATABASE=os.environ.get('heroku_****'),
)
Комментарии:
1. Вы используете базу данных MySQL локально или удаленно? Какую конфигурацию (исключая имя пользователя / пароль) вы используете? Есть несколько причин, по которым клиент может не подключиться. Вы можете попробовать подключиться к базе данных с помощью CLI или с помощью клиента базы данных с графическим интерфейсом, чтобы попытаться сузить ошибку до чего-то более конкретного.
2. Я здесь немного новичок, поэтому заранее прошу прощения, если я не совсем отвечу на то, что вы ожидали. У меня была локальная база данных, а затем я экспортировал ее в herokus online. Хост: us-cdbr-east-02.cleardb.com ; база данных: heroku_ec53029ac676735. Я использую ClearDB на heroku. Я обнаружил, что это может произойти из-за адреса привязки, но я уже изменил это, и я все еще получаю эту ошибку.
3. Вы пытаетесь подключиться к удаленной базе данных Heroku? Можете ли вы опубликовать часть своего кода в своем вопросе, не раскрывая ничего конфиденциального? Например, где вы устанавливаете адрес? Где вы подключаетесь к базе данных?
4. Предполагая, что вы используете github.com/brandenc40/flask_mysql_connector , возможно, вам потребуется установить
app.config['MYSQL_HOST']
значениеus-cdbr-east-02.cleardb.com
иapp.config['MYSQL_DATABASE']
значениеheroku_ec53029ac676735
.5. Да, я пытаюсь подключиться к удаленному heroku cleardb. Вот код конфигурации —>:
def create_app(): app = Flask(__name__) app.config.from_mapping( SECRET_KEY = "***", DATABASE_HOST=os.environ.get('us-cdbr-east-02.cleardb.com'), DATABASE_PASSWORD=os.environ.get('***'), DATABASE_USER=os.environ.get('***'), DATABASE=os.environ.get('heroku_ec53029ac676735'), )
Я не знаю, почему я не могу подключиться, поскольку, когда я работал локально, я смог войти в систему и создать пользователя в своем приложении без проблем
Ответ №1:
Короткий ответ: os.environ.get()
вернет значение переменной среды или пустую строку, если эта переменная среды не установлена. То, что вы хотите сделать, установлено DATABASE_HOST
в ****.cleardb.com
, но то, что делает ваш код, ничего не устанавливает DATABASE_HOST
, потому ****.cleardb.com
что в вашей среде нет переменных окружения, именованных. Затем ваш клиент предполагает, что вы хотите использовать localhost
(это адрес, который ваш компьютер использует для себя, вы также можете увидеть 127.0.0.1
или 0.0.0.0
).
Может быть переменная среды с именем «DATABASE_HOST» или переменная с другим именем, значение которой равно ****.cleardb.com
*. Попробуйте DATABASE_HOST='****.cleardb.com'
посмотреть, работает ли это, а затем вы можете переключиться на использование чего-то подобного os.environ.get('DATABASE_HOST')
в вашем исходном коде, а не жестко кодировать адрес Heroku и DATABASE_HOST
локально устанавливать на своем компьютере адрес Heroku.
Попробуйте что-то подобное, с вашими фактическими значениями, не передавая его в систему управления версиями (потому что это угроза безопасности), просто чтобы убедиться, что у вас правильные значения:
def create_app():
app = Flask(__name__)
app.config.from_mapping(
SECRET_KEY = "***",
DATABASE_HOST='****.cleardb.com',
DATABASE_PASSWORD='***',
DATABASE_USER='***',
DATABASE='heroku_****',
)
Как только вы подтвердите, что можете подключиться с помощью жестко запрограммированных переменных, вам следует проверить, помогает ли вам ориентироваться документация Heroku config / environment variables. В Python вы получаете доступ к тому, что они называют «конфигурационными переменными», так же, как и то, что я называл «переменными среды». Правильное конечное состояние должно быть примерно таким:
- На вашем локальном компьютере установлен набор переменных среды со значениями, которые вы хотите использовать. Если вы используете macOS / Linux / bash, эта документация о том, как читать и записывать переменные среды, может помочь. У них должны быть те же имена, которые использует Heroku, потому что вы хотите, чтобы они получали правильное значение, когда среда (локальная или удаленная) отличается. Ради этого примера мы дадим им всем префикс
HEROKU_
. - Ваш код использует
os.environ.get()
и соответствующее имя переменной среды для получения этого значения, и оно должно получить правильное значение локально (когда ваша локальная база данных запущена) или удаленно (когда вы работаете в облаке Heroku).
Теоретически это выглядело бы так:
def create_app():
app = Flask(__name__)
app.config.from_mapping(
SECRET_KEY = os.environ.get('HEROKU_SECRET_KEY'),
DATABASE_HOST=os.environ.get('HEROKU_DATABASE_HOST'),
DATABASE_PASSWORD=os.environ.get('HEROKU_DATABASE_PASSWORD'),
DATABASE_USER=os.environ.get('HEROKU_DATABASE_USER'),
DATABASE=os.environ.get('HEROKU_DATABASE'),
)
Если я правильно понял ваш комментарий, похоже, что вы устанавливаете переменные Python в значения, которые хотите использовать (например, « DATABASE_HOST='some.host-name.example.com'
«), затем передаете вашему приложению сопоставление ключей конфигурации со значениями, которые вы извлекаете, запрашивая у среды переменные с именами значений, которые вы хотите использовать, напримерэто:
DATABASE_HOST='some.host-name.example.com'
def create_app():
app = Flask(__name__)
app.config.from_mapping(
DATABASE_HOST=os.environ.get(DATABASE_HOST),
)
Когда для вашей переменной Python named DATABASE_HOST
установлено значение 'some.host-name.example.com'
, os.environ.get(DATABASE_HOST) сообщает Python получить значение переменной с именем «some.host-name.example.com «, а не «DATABASE_HOST», из среды за пределами вашего кода. Вы видите разницу? В одном случае вы передаете переменную, которая преобразуется в строку, и Python посмотрит это, обнаружит, что у вас нет переменной среды с именем «some.host-name.example.com «, и ничего не возвращать.
Если у вас есть переменная окружения с именем «DATABASE_HOST», «HEROKU_DATABASE_HOST» или «DERF», вы хотите передать os.environ.get()
строку, которая соответствует имени вашей переменной окружения (so, os.environ.get('DERF')
вернет любое значение DERF
, установленное в среде, в которой выполняется ваш код. Чтобы расширить приведенный выше пример, это сработало бы, _ при условии, что у вас есть переменная среды с именем DATABASE_HOST
. Эта переменная среды находится за пределами вашего кода:
ANY_VARIABLE_NAME_IT_DOESNT_MATTER='DATABASE_HOST'
def create_app():
app = Flask(__name__)
app.config.from_mapping(
DATABASE_HOST=os.environ.get(ANY_VARIABLE_NAME_IT_DOESNT_MATTER),
)
Хотя может быть веская причина сделать что-то подобное приведенному выше, вы можете просто сделать это, что будет более разборчиво:
def create_app():
app = Flask(__name__)
app.config.from_mapping(
DATABASE_HOST=os.environ.get('DATABASE_HOST'),
# notice the single quotes --^-------------^
)
* используйте здесь свое реальное, неотредактированное имя хоста.
Комментарии:
1. Хорошо, но должен ли я изменить это только на хосте или для каждой переменной базы данных, такой как пароль, имя пользователя и базы данных?
2. @Franco Это зависит от того, отличаются ли они? Здесь есть две разные проблемы: во-первых, вы отправляете пустое значение для одной конфигурации из-за способа вызова
os.environ.get()
. Во-вторых, переменные среды могут (и будут) различаться в разных средах (отсюда и название). Они не должны меняться. Но если ваше имя пользователя / пароль различаются на компьютере перед вами и в среде Heroku, да. У Heroku должна быть документация об именах переменных среды по умолчанию, которые вы можете использовать, и они будут обрабатывать переключение значений в разных средах.3. @Franco Более конкретно, вы не должны жестко указывать свои учетные данные в своем источнике. Использование переменных окружения — это 100% правильный путь! Я только предлагаю жестко запрограммировать хост базы данных как способ подтвердить, что это ваша единственная проблема, а затем переключиться на использование лучших практик (не жестко кодировать эти значения в вашем источнике).
4. Я сделал, как вы мне сказали, DATABASE_HOST= ‘****.cleardb.com но когда я попытался войти в систему, я получил сообщение об ошибке, поэтому я сделал это, но с каждой переменной базы данных, и именно тогда я увидел баннер Chrome, сообщающий мне, что сайт был взломан и что я должен сменить пароль правильноотсутствует.
5. После этого я выполнил следующее и получил ту же ошибку, что и в начале ->
DATABASE_HOST = '***.cleardb.com' DATABASE_PASSWORD = '***' DATABASE_USER = '***' DATABASE = 'heroku_***' def create_app(): app = Flask(__name__) app.config.from_mapping( SECRET_KEY= '***', DATABASE_HOST= os.environ.get(DATABASE_HOST), DATABASE_PASSWORD= os.environ.get(DATABASE_PASSWORD), DATABASE_USER= os.environ.get(DATABASE_USER), DATABASE= os.environ.get(DATABASE), )
Чего мне здесь не хватает? Надеюсь, вы поняли, что я пытаюсь сказать