Program Tip

MongoKit vs MongoEngine vs Flask-MongoAlchemy for Flask

programtip 2020. 10. 27. 23:09
반응형

MongoKit vs MongoEngine vs Flask-MongoAlchemy for Flask


누구나 MongoKit, MongoEngine 또는 Flask 용 Flask-MongoAlchemy에 대한 경험이 있습니까?

어느 것을 더 선호 해? 긍정적이거나 부정적인 경험?. Flask-Newbie에게는 너무 많은 옵션이 있습니다.


MongoDB 용으로 인기있는 Python ORM을 평가하는 데 많은 시간을 투자했습니다. 제가 정말 하나를 선택하고 싶었 기 때문에 이것은 철저한 운동이었습니다.

내 결론은 ORM이 MongoDB의 재미를 제거한다는 것입니다. 아무도 자연스럽지 않고, 처음에 관계형 데이터베이스에서 멀어지게 만든 것과 유사한 제한을 부과합니다.

다시 말하지만, 저는 정말로 ORM을 사용하고 싶었지만 이제는 pymongo직접 사용 하는 것이 갈 길이 라고 확신합니다 . 이제 저는 MongoDB,, pymongoPython 을 포괄하는 패턴을 따릅니다 .

리소스 지향 아키텍처는 매우 자연스러운 표현으로 이어집니다. 예를 들어 다음 사용자 리소스를 사용합니다.

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헤더를 가져와 적절한 표현 (예 : application/json, 또는 text/html)을 생성합니다. 구현하는 것은 어렵지 않습니다. 또한 Last-Modified헤더를 추가합니다 .

물론 입력 내용을 삭제해야하며 제시된대로 코드가 작동하지 않습니다 (예제로서 의미하지만 내 요점을 이해하는 것은 어렵지 않습니다).

다시 말하지만 모든 것을 시도했지만이 아키텍처는 내 코드를 유연하고 간단하며 확장 가능하게 만들었습니다.

참고URL : https://stackoverflow.com/questions/9447629/mongokit-vs-mongoengine-vs-flask-mongoalchemy-for-flask

반응형