Я пытаюсь сделать 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.
