#python #heroku #pymongo #python-telegram-bot
#python #heroku #pymongo #python-telegram-bot
Вопрос:
Это мой код
from telegram.ext import Updater, CommandHandler
import os
from pymongo import MongoClient
TOKEN = 'TOKEN'
def get_db(update, context):
cluster = MongoClient("mongodb srv://testing:12345678@cluster0.gs9k5.mongodb.net/test?retryWrites=trueamp;w=majority")
result = list(cluster.get_database('DBNAME')['COLLECTIONNAME'].find({}))
update.message.reply_text(str(result))
def main():
updater = Updater(TOKEN, use_context=True)
dp = updater.dispatcher
dp.add_handler(CommandHandler("getdb", get_db))
updater.start_webhook(listen="#.#.#.#",
port=int(PORT),
url_path=TOKEN)
updater.bot.setWebhook('https://MYHEROKUAPP.herokuapp.com/' TOKEN)
updater.idle()
if __name__ == '__main__':
main()
Каждый раз, когда я печатаю /getdb
, бот не дает мне никакого ответа. Когда я попробовал несколько экспериментов, кажется, что в переменной кластера есть какая-то ошибка. Я использовал синтаксис try except, но бот ничего не показывал, даже из except, и я также не смог найти имя ошибки. И я использую сервер heroku для бота telegram. Как это исправить?
Ответ №1:
Вы можете подключиться к базе данных по умолчанию (которая определена в строке подключения) и запросить коллекции следующим образом
client = MongoClient('connect-string')
db = client.get_default_database()
# 'collection_name' is the name of the Mongo collection
list = db.collection_name.find()
Комментарии:
1. Я ценю ваш ответ, но между вашим кодом и моим кодом нет различий (особенно переменная кластера и переменная клиента одинаковы)
2. Код очень похож, разница заключается в использовании
get_default_database
и использовании ключа dict вместоget()
, что улучшает читаемость и снижает вероятность ошибок (нет необходимости жестко кодировать имя БД). Вы получаете какую-то информацию в stacktrace? Вы пробовалиclient .server_info
?3. Также рекомендуется избегать строки подключения и учетных данных в ваших вопросах
4. Я попробовал ваш код, но ответа от него по-прежнему нет.
5. Ошибок нет? просто нет ответа? Вы внесли в белый список IP-адрес, с которого вы подключаетесь? Я разрешил все (
0.0.0.0/0
)
Ответ №2:
Я не уверен, что у вас все еще есть эта проблема, но пока, похоже, с кодом все в порядке. Попробуйте записать информацию о приложении в терминал, чтобы лучше понять, в чем ошибка.
import logging
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
logger = logging.getLogger(__name__)
- Возможно, ваш MongoDB Atlas не разрешает подключение с сервера, с которого вы запускаете свой код. Вы можете проверить свой кластер, чтобы узнать, разрешает ли он доступ к БД с вашего сервера. Вы можете добавить IP-адрес своего сервера в кластер, чтобы он мог успешно получать доступ к данным.
- Если коллекция, из которой вы пытаетесь отобразить все элементы, большая, Telegram выдаст ошибку, потому что последующее сообщение будет слишком длинным. Убедитесь, что вы запускаете свой тест только с несколькими элементами в вашей тестовой базе данных.
- Вы должны иметь возможность проверять свои журналы heroku или в своем терминале, чтобы узнать, какие другие ошибки могут возникать
Комментарии:
1. Спасибо за ответ, я решил проблему, из-за которой забыл установить dnspython