Организация работы с MongoDB во Flask

Я пытаюсь сделать API для Flask вместе с MongoDB, до этого я использовал базу данных SQL с помощью SQLAlchemy, и там я использовал модели для организации базы данных.

Теперь немного запуталась, как организовать код для работы с БД. Поскольку стандартный клиент MongoDB не дает возможности создавать модели, а Mongoengine мне не понравился, я решил вынести любые методы базы данных в отдельный класс:

import uuid
from datetime import datetime

from flask import request
from werkzeug.security import generate_password_hash

from app import mongo


class User:

    db = mongo.db.users

    def new_user(self):
        '''New user Registration.

        Request body (JSON):
            email (str)
            username (str)
            password (str)
        Returns:
            status, result (tuple):
                100, user (dict) - in case of successful registration
                102, None - one of the parameters is missing
                201, None - such user already exists
        '''

        try:
            data = {
                '_id': uuid.uuid4().hex,
                'email': request.json['email'],
                'username': request.json['username'],
                'password': generate_password_hash(
                    request.json['password']),
                'createdAt': datetime.utcnow()
            }
        except KeyError:
            return 102, None

        user = self.db.find_one({
            '$or': [
                {'email': data['email']},
                {'username': data['username']}
            ]
        })

        if not user:
            self.db.insert_one(data)
            return 100, data
        else:
            return 201, None

    def login(self):
        pass

    def get_data(self):
        pass

from flask import Blueprint, jsonify, request

from app.models import User


users = Blueprint('users', __name__)


@users.route('/users/new_user', methods=['POST'])
def new_user():
    '''Adding a new user to the database.
    '''

    status, user = User().new_user()

    if status == 100:
        return jsonify({'status': True, 'code': 100, 'result': user})
    elif status == 102:
        return jsonify({
            'status': False, 'code': 102,
            'result': 'missing one of parameters'})
    elif status == 201:
        return jsonify({
            'status': False, 'code': 201, 'result': 'user already exists'})

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

Сейчас я думаю о создании модели по аналогии с моделями из SQLAlchemy, чтобы переменные класса представляли ключи в документах, а также простые методы для запросов в базе данных. Но это также может вызвать путаницу. Я просто хочу попытаться избежать дублирования кода, а также вариативности для повторного использования.

Я приму любые советы или подсказки, как это должно быть «правильно». К сожалению, я не нашел структуры проекта, использующей MongoDB.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *