Flask-MongoAlchemy для Flask [закрыто] MongoKit против MongoEngine

Кто-нибудь имеет опыт работы с MongoKit, MongoEngine или Flask-MongoAlchemy для Flask?

Какой из них вы предпочитаете? Положительный или отрицательный опыт? Слишком много вариантов для флакона-новичка.

67 голосов | спросил r0sk 26 FebruaryEurope/MoscowbSun, 26 Feb 2012 00:09:37 +0400000000amSun, 26 Feb 2012 00:09:37 +040012 2012, 00:09:37

1 ответ


0

Я потратил много времени на оценку популярных Python ORM для MongoDB. Это было исчерпывающее упражнение, так как я очень хотел его выбрать.

Я пришел к выводу, что ORM убирает удовольствие от MongoDB. Никто не чувствует себя естественно, они налагают ограничения, подобные тем, которые заставили меня отказаться от реляционных баз данных.

Опять же, я действительно хотел использовать ORM, но теперь я убежден, что использование pymongo напрямую. Теперь я следую шаблону, который включает MongoDB, pymongo и Python.

Ресурсно-ориентированная архитектура приводит к очень естественным представлениям. Например, возьмите следующий ресурс пользователя:

from werkzeug.wrappers import Response
from werkzeug.exceptions import NotFound

Users = pymongo.Connection("localhost", 27017)["mydb"]["users"]


class User(Resource):

    def GET(self, request, username):
        spec = {
            "_id": username,
            "_meta.active": True
        }
        # this is a simple call to pymongo - really, do
        # we need anything else?
        doc = Users.find_one(spec)
        if not doc:
            return NotFound(username)
        payload, mimetype = representation(doc, request.accept)
        return Response(payload, mimetype=mimetype, status=200)

    def PUT(self, request, username):
        spec = {
            "_id": username,
            "_meta.active": True
        }
        operation = {
            "$set": request.json,
        }
        # this call to pymongo will return the updated document (implies safe=True)
        doc = Users.update(spec, operation, new=True)
        if not doc:
            return NotFound(username)
        payload, mimetype = representation(doc, request.accept)
        return Response(payload, mimetype=mimetype, status=200)

Базовый класс Resource выглядит следующим образом

class Resource(object):

    def GET(self, request, **kwargs):
        return NotImplemented()

    def HEAD(self, request, **kwargs):
        return NotImplemented()

    def POST(self, request, **kwargs):
        return NotImplemented()

    def DELETE(self, request, **kwargs):
        return NotImplemented()

    def PUT(self, request, **kwargs):
        return NotImplemented()

    def __call__(self, request, **kwargs):
        handler = getattr(self, request.method)
        return handler(request, **kwargs)

Обратите внимание, что я напрямую использую спецификацию WSGI и использую Werkzeug где это возможно (кстати, я думаю, что Flask добавляет ненужное усложнение в Werkzeug)

Функция representation принимает Accept headers и создает подходящее представление (например, application/json или text/html). Это не сложно реализовать. Он также добавляет заголовок Last-Modified.

Конечно, ваш ввод должен быть подвергнут санитарной обработке, и представленный код не будет работать (я имею в виду это в качестве примера, но не трудно понять мою точку зрения).

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

ответил Escualo 26 FebruaryEurope/MoscowbSun, 26 Feb 2012 00:27:59 +0400000000amSun, 26 Feb 2012 00:27:59 +040012 2012, 00:27:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132