WedX - журнал о программировании и компьютерных науках

Как отправить почтовый запрос с почтальоном, а также сохранить в базе данных Mongo?

Я делаю API генератора вымышленных персонажей. Работает нормально, когда я отправляю запросы через Postman при локальном запуске, но выдает ошибку 500 и время ожидания при запуске через докер. В указанном приложении API фляги:

from flask import Flask, jsonify, request
from flask_restful import Api, Resource
... 
class AddCharacter(Resource):
    def post(self):
...
        p.add_person()
        # saves the character to a mongodb
        p.save_person() #<-- causes a 500 error in postman when run through docker build and docker up
        retJson = {
            "Message": "Character has been created",
            "Status Code": 200
        }
        return jsonify(retJson)

Как я подключаюсь к монго:

db = MongoEngine()

app = Flask(__name__)

app.config['MONGODB_SETTINGS'] = {
    'db': 'projectdb',
    'host': 'localhost',
    'port': 27017


}

with app.app_context():
    db.init_app(app)
    try:
        db_client = db.connection['projectdb']
    except ConnectionFailure as e:
        sys.stderr.write("Could not connect to MongoDB: %s" % e)
    sys.exit(1)

менеджер базы данных:

class DatabaseManager():

    def save_user(self, first_name, last_name, openness, conscientiousness, extraversion,
                  agreeableness, emotional_stability, organization, anxiety,
                  knowledgeableness, sympathy, talkativeness, accommodation,
                  expressiveness, carefulness, depressiveness, gregariousness,
                  altruism, inquisitiveness):
        new_user = User(first_name=first_name, last_name=last_name)
        new_user.save()
        new_personality = Personality(Openness=openness, Conscientiousness=conscientiousness, Extraversion=extraversion,
                                      Agreeableness=agreeableness, EmotionalStability=emotional_stability,
                                      Organization=organization, Anxiety=anxiety,
                                      Knowledgeableness=knowledgeableness, Sympathy=sympathy,
                                      Talkativeness=talkativeness, Accommodation=accommodation,
                                      Expressiveness=expressiveness, Carefulness=carefulness,
                                      Depressiveness=depressiveness, Gregariousness=gregariousness,
                                      Altruism=altruism, Inquisitiveness=inquisitiveness)
        new_profile = Profile(person=new_user, personality=new_personality)
        new_profile.save()

В классе Человек:

def save_person(self):
    dm.save_user(first_name=self.first_name, last_name=self.last_name, openness=aff.Openness,
                 conscientiousness=aff.Conscientiousness, extraversion=aff.Extraversion,
                 agreeableness=aff.Agreeableness, emotional_stability=aff.EmotionalStability,
                 organization=aff.Organization, anxiety=aff.Anxiety,
                 knowledgeableness=aff.Knowledgeableness, sympathy=aff.Sympathy, talkativeness=aff.Talkativeness,
                 accommodation=aff.Accommodation,
                 expressiveness=aff.Expressiveness, carefulness=aff.Carefulness, depressiveness=aff.Depressiveness,
                 gregariousness=aff.Gregariousness,
                 altruism=aff.Altruism, inquisitiveness=aff.Inquisitiveness)

структура файла Dockerfile requirements.txt .yml file

файловая структура, Dockerfile, требования.txt, образы файлов .yml. Я запускаю докер с sudo docker-compose build, а затем sudo docker-compose up


  • Если ваш код отлично работает на локальном компьютере, а не на докере, вероятно, проблема в том, как вы запускаете свой контейнер докера. Пожалуйста, добавьте, как вы создаете свой образ и как вы его запускаете. 14.06.2020
  • Добавлены дополнительные файлы построения образа. Я хочу добавить пояснение, что AddCharacter отлично работает на докере, когда он не пытается сохранить в монго. Что-то делает почтальона тайм-аутом при записи в mongo db через докер. 14.06.2020
  • Как вы подключаете свое фляжное приложение к монго? Какое имя хоста вы используете? 14.06.2020
  • Добавлено, как я подключаю флягу app.py к монго. Я использую «localhost» и порт: 27017. 14.06.2020

Ответы:


1

Судя по вашей настройке, на хост-компьютере работает сервер базы данных, к которому вы не можете получить доступ из виртуальной сети вашего контейнера. Здесь вам нужно связать хост-сеть и порты с виртуальной сетью контейнера, чтобы ваше приложение могло для доступа к базе данных, поскольку она может работать на том же хосте в соответствии с конфигурацией вашего приложения.

По умолчанию контейнер Docker запускается в режиме моста, при запуске контейнера ничего явно не указано в сетевых режимах, поэтому либо вы можете связать сервер базы данных с IP-адресом моста, либо указать сетевой режим для хоста для вашего контейнера.

14.06.2020
  • Спасибо! Как и где подключить хост-сеть и порты к виртуальной сети контейнера? 14.06.2020
  • чтобы получить IP-адрес моста, вы можете запустить команду route изнутри контейнера, чтобы посмотреть таблицу маршрутизации и связать сервер БД с этим IP-адресом, или если вы просто хотите протестировать использование этой машины, только вы можете указать флаг --network="host", когда запускаем докер-контейнер. Источник: дополнительная информация 14.06.2020

  • 2

    Проблема в том, как вы подключаетесь к MongoDB из бэкэнда.

    Имейте в виду, что localhost для контейнера докеров отличается от работающего хоста и указывает на сам контейнер (если вы не запускаете контейнеры в сети хоста). Таким образом, почти в 99% случаев вы не хотите подключаться к localhost в докеризованной среде.

    По умолчанию docker-compose создает внутреннюю сеть между запущенными контейнерами, так что вы можете разрешить IP-адрес контейнера по имени его службы. То есть, если вы замените localhost на db (имя вашей службы базы данных), вы сможете подключиться к своей базе данных.

    14.06.2020

    3

    Я обнаружил, что добавление сетей в docker-compose.yml устранило проблему:

    введите здесь описание изображения

    15.06.2020
    Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]