Хтось має досвід роботи з MongoKit, MongoEngine або Flask-MongoAlchemy for Flask?
Який тобі більше подобається? Позитивний чи негативний досвід ?. Забагато варіантів для колби-новачка.
Хтось має досвід роботи з MongoKit, MongoEngine або Flask-MongoAlchemy for Flask?
Який тобі більше подобається? Позитивний чи негативний досвід ?. Забагато варіантів для колби-новачка.
Відповіді:
Я вклав багато часу, оцінюючи популярні ORM Python для 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
заголовки запиту та створює відповідне подання (наприклад,, application/json
або text/html
). Це не складно здійснити. Він також додає Last-Modified
заголовок.
Звичайно, ваш внесок потрібно продезінфікувати, і код, як представлено, не буде працювати (я маю на увазі це як приклад, але не важко зрозуміти мою думку).
Знову ж таки, я спробував усе, але ця архітектура зробила мій код гнучким, простим і розширюваним.