MongoKit vs MongoEngine vs Flask-MongoAlchemy for Flask [終了しました]。
質問
どなたか 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
ヘッダも追加されます。
もちろん、入力はサニタイズされる必要があり、提示されたコードは動作しません(例として意味していますが、私の主張を理解するのは難しいことではありません)。
繰り返しますが、私はあらゆることを試しましたが、このアーキテクチャによって私のコードは柔軟で、シンプルで、拡張可能なものになりました。
関連
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] pandasを使った "大量データ "ワークフロー【終了しました
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] Flaskのリクエストで受信したデータを取得する
-
[解決済み] 2次元アレイにおけるピーク検出
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] サブフォルダからのインポートモジュール
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] if 節の終了方法
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?