Додавання MongoDB до Flask

pic

Для цього проєкту я вибрав використання Podman замість Docker. Якщо ви не знайомі з Podman, не хвилюйтеся, Podman все одно використовує Dockerfiles та подібні команди. Я працюю на основі базової установки Flask. Ви можете слідувати цим інструкціям, щоб наздогнати:

[

Базова установка Flask з Podman

Мені потрібно було налаштувати Python Flask додаток для бекенд-сервісу.

medium.com

](/@brianmayrose/basic-flask-setup-with-podman-6024ba6769e5?source=post_page-----087966930eee--------------------------------)

Першим кроком є додавання директорії, в якій зберігатимуться всі наші файли бази даних, до кореневої папки.

mkdir mongodb  
cd mongodb

Тепер створимо том Podman для постійного зберігання:

podman volume create mongodb_data

У директорії mongodb створіть Dockerfile для MongoDB:

FROM [docker.io/](/docker.io/mongo:6.0)mongo:6.0  

# стандартний порт MongoDB  
EXPOSE 27017  

# Налаштуємо том для постійного зберігання даних  
VOLUME ["/data/db"]  

CMD ["mongod"]

Створимо мережу Podman, щоб контейнери могли комунікувати:

podman network create interactive-network

Тепер можемо зібрати контейнер MongoDB і запустити його:

podman build -t mongodb:latest -f mongodb/Dockerfile .  

podman run --name mongodb \  
 --network interactive-network \  
 -p  
 -d docker.io/mongo:6.0

Це збудує і запустить MongoDB локально, відкриваючи порт 27027.

Давайте встановимо драйвер MongoDB для Flask. Для цього додамо pymongo до файлу requirements.txt у кореневій директорії:

flask  
pymongo

Тепер перезіб'ємо контейнер Flask і перевіримо наявність помилок:

podman build -t flask-backend:latest -f backend/Dockerfile .

Тепер ми можемо підключити MongoDB до Flask. Додамо з'єднання MongoDB до файлу backend/app.py:

from pymongo import MongoClient  

# підключення до MongoDB  
client = MongoClient("mongodb://mongodb:27017/")  
db = client["interactive_portfolio"]

Podman автоматично вирішить hostname mongodb до контейнера MongoDB в межах однієї мережі.

Оскільки ми вже знаходимося у файлі app.py, ми можемо додати два ендпоінти для тестування з'єднання з MongoDB.

Перший ендпоінт буде POST, що додає елемент до бази даних:

@app.route('/add-post', methods=['POST'])  
def add_skill():  
 # Приклад елемента для вставки  
 item = {"name": "Joe", "level": "Expert"}  
 db.skills.insert_one(item)  
 return jsonify({"mesage": "Item added!"})

Другий ендпоінт буде GET, що запитуватиме доданий елемент:

@app.route('/items', methods=['GET'])  
def get_items():  
 items = list(db.items.find({}, {"_id": 0}))  
 return jsonify(items)

Ось приклад повного файлу app.py:

from flask import Flask, jsonify  
from pymongo import MongoClient  

app = Flask(__name__)  

# підключення до MongoDB  
client = MongoClient("mongodb://mongodb:27017/")  
db = client["Flask_API"]  

@app.route('/')  
def home():  
 return jsonify({"message": "Flask API Home"})  

@app.route('/add-item', methods=['POST'])  
def add_skill():  
 # Приклад елемента для вставки  
 item = {"name": "Joe", "level": "Expert"}  
 db.items.insert_one(item)  
 return jsonify({"mesage": "Item added!"})  

@app.route('/items', methods=['GET'])  
def get_items():  
 items = list(db.items.find({}, {"_id": 0}))  
 return jsonify(items)  

if __name__ == "__main__":  
 app.run(host='0.0.0.0', port=5000)

Перезіб'ємо і запустимо контейнер Flask:

podman build -t flask-backend:latest -f backend/Dockerfile .  

podman run --name flask-backend \  
 --network interactive-network \  
 -p 5000:5000 \  
 flask-backend:latest

Тепер перевіримо, чи все працює. Я використовував Postman, щоб додати елемент і отримати елемент.

Надішліть POST запит до URL http://localhost:5000/add-item, і ви повинні побачити повідомлення "Item added!" (Елемент додано!).
Тепер, якщо ви перейдете через браузер або надішлете GET запит до http://localhost:5000/items.

Тепер ми налаштували та інтегрували MongoDB з дуже простим налаштуванням Flask. Ми створили контейнер MongoDB, підключили його до Flask додатку і реалізували базову інтеграцію для перевірки з'єднання.

Перекладено з: Adding MongoDB to Flask

Leave a Reply

Your email address will not be published. Required fields are marked *