1. ホーム
  2. python

MongoKit vs MongoEngine vs Flask-MongoAlchemy for Flask [終了しました]。

2023-08-05 16:54:37

質問

どなたか MongoKit, MongoEngine, Flask-MongoAlchemy for Flask の経験をお持ちの方はいらっしゃいますか?

どれが好きですか?肯定的な、または否定的な経験?Flask-Newbieには選択肢が多すぎる。

どのように解決するのですか?

私は、MongoDB 用の人気のある Python ORM を評価するのに多くの時間を費やしました。これは、本当に 1 つを選びたかったので、徹底的な訓練でした。

私の結論は、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 ヘッダを受け取り、適切な表現を生成します (例えば application/json または text/html ). 実装は難しくありません。また、この実装では Last-Modified ヘッダも追加されます。

もちろん、入力はサニタイズされる必要があり、提示されたコードは動作しません(例として意味していますが、私の主張を理解するのは難しいことではありません)。

繰り返しますが、私はあらゆることを試しましたが、このアーキテクチャによって私のコードは柔軟で、シンプルで、拡張可能なものになりました。