from flask_mongoengine import MongoEngine
db = MongoEngine()
class ConfigureEnvModel(db.Document):
id = db.StringField(required=True, max_length=50, unique=True, primary_key=True)
name = db.StringField(required=False, max_length=50)
meta = {
"collection": "configure_env",
"index": [{
'fields': ['id'],
'unique': True,
}]
}
class ConfigureDisconfModel(db.Document):
id = db.StringField(required=True, max_length=50, unique=True, primary_key=True)
env = db.StringField(required=False, max_length=50)
name = db.StringField(required=False, max_length=50)
username = db.StringField(required=False, max_length=50)
password = db.StringField(required=False, max_length=50)
url = db.StringField(required=False, max_length=50)
meta = {
"collection": "configure_disconf",
"index": [{
'fields': ['id'],
'unique': True,
}]
}
class ConfigureNginxModel(db.Document):
id = db.StringField(required=True, max_length=50, unique=True, primary_key=True)
env = db.StringField(required=False, max_length=50)
name = db.StringField(required=False, max_length=50)
url = db.StringField(required=False, max_length=50)
meta = {
"collection": "configure_nginx",
"index": [{
'fields': ['id'],
'unique': True,
}]
}
import logging
from flask_restful import reqparse, Api, Resource, fields
from uop.configure import configure_blueprint
from uop.models import ConfigureEnvModel
from uop.models import ConfigureNginxModel
from uop.models import ConfigureDisconfModel
configure_api = Api(configure_blueprint)
class ConfigureEnv(Resource):
@classmethod
def get(cls):
# NOTE: 所有結果查詢
ret = ConfigureEnvModel.objects.all()
#ret = ConfigureEnvModel.objects()
envs = []
for env in ret:
envs.append(dict(id=env.id,
name=env.name))
res = {
'code': 200,
'result': {
'res': envs,
'msg': u'請求成功'
}
}
return res
class Configure(Resource):
@classmethod
def get(cls):
parser = reqparse.RequestParser()
parser.add_argument('env', type=str)
parser.add_argument('category', type=str)
args = parser.parse_args()
category = parser.parse_args()
env = args.env if args.env else 'dev'
category = args.category if args.category else 'nginx'
logging.info("[UOP] Get configs, env:%s, category: %s", env, category)
envs = []
if category == 'nginx':
# NOTE: 條件查詢 下面2條語句效果等價
ret = ConfigureNginxModel.objects.filter(env=env)
# ret = ConfigureNginxModel.objects(env=env)
for env in ret:
envs.append(dict(id=env.id,
name=env.name,
url=env.url))
else: # disconf
ret = ConfigureDisconfModel.objects.filter(env=env)
for env in ret:
envs.append(dict(id=env.id,
name=env.name,
username=env.username,
password=env.password,
url=env.url))
res = {
'code': 200,
'result': {
'res': envs,
'msg': u'請求成功'
}
}
return res
@classmethod
def post(cls):
parser = reqparse.RequestParser()
parser.add_argument('env', type=str)
parser.add_argument('category', type=str)
parser.add_argument('url', type=str)
parser.add_argument('name', type=str)
parser.add_argument('username', type=str)
parser.add_argument('password', type=str)
args = parser.parse_args()
env = args.env if args.env else 'dev'
url = args.url if args.url else 'dev'
name = args.name if args.name else ''
username = args.username if args.username else 'dev'
password = args.password if args.password else 'dev'
category = args.category if args.category else 'nginx'
logging.info("[UOP] Create configs, env:%s, category: %s", env, category)
import uuid
id = str(uuid.uuid1())
if category == 'nginx':
# NOTE: 建立一個document
ret = ConfigureNginxModel(env=env,
url=url,
name=name,
id=id).save()
else:
ret = ConfigureDisconfModel(env=env,
url=url,
name=name,
username=username,
password=password,
id=id).save()
res = {
'code': 200,
'result': {
'res': id,
'msg': u'請求成功'
}
}
return res
@classmethod
def put(cls):
parser = reqparse.RequestParser()
parser.add_argument('env', type=str)
parser.add_argument('category', type=str)
parser.add_argument('url', type=str)
parser.add_argument('name', type=str)
parser.add_argument('username', type=str)
parser.add_argument('password', type=str)
parser.add_argument('id', type=str)
args = parser.parse_args()
category = parser.parse_args()
env = args.env if args.env else 'dev'
id = args.id if args.id else ''
url = args.url if args.url else ''
name = args.name if args.name else ''
category = args.category if args.category else 'nginx'
username = args.username if args.username else ''
password = args.password if args.password else ''
logging.info("[UOP] Modify configs, env:%s, category: %s", env, category)
if category == 'nginx':
ret = ConfigureNginxModel.objects(id=id)
#NOTE: ret = ConfigureNginxModel.objects.filter(id=id)
ret.update(name=name,url=url)
else:
ret = ConfigureDisconfModel.objects(id=id)
ret.update(name=name,url=url,username=username,password=password)
res = {
'code': 200,
'result': {
'msg': u'請求成功'
}
}
return res
@classmethod
def delete(cls):
parser = reqparse.RequestParser()
parser.add_argument('env', type=str)
parser.add_argument('category', type=str)
parser.add_argument('id', type=str)
args = parser.parse_args()
category = parser.parse_args()
env = args.env if args.env else 'dev'
category = args.category if args.category else 'nginx'
id = args.id if args.id else -1
logging.info("[UOP] Delete configs, env:%s, category: %s, id: %s", env, category, id)
if category == 'nginx':
# NOTE: 查詢一個document
# ConfigureNginxModel.objects.filter(id=id).delete() 等價于 ConfigureNginxModel.objects.delete()
ret = ConfigureNginxModel.objects.filter(id=id)
else:
ret = ConfigureDisconfModel.objects.filter(id=id)
if len(ret):
ret.delete()
else:
logging.info("[UOP] Do not found the item, id:%s", id)
res = {
'code': 200,
'result': {
'msg': u'請求成功'
}
}
return res
configure_api.add_resource(ConfigureEnv, '/env')
configure_api.add_resource(Configure, '/')
擴展閱讀
flask-mongoengire 的文檔比較缺乏舟肉,這里主要看mongoengine 的文檔伺帘。
https://pypi.python.org/pypi/flask-mongoengine
2.5. Querying the database
http://docs.mongoengine.org/guide/querying.html?highlight=modify
簡介:
查詢:
The query may be filtered by calling the [QuerySet
](http://docs.mongoengine.org/apireference.html#mongoengine.queryset.QuerySet) object with field lookup keyword arguments. The keys in the keyword arguments correspond to fields on the [Document
](http://docs.mongoengine.org/apireference.html#mongoengine.Document) you are querying:
# This will return a QuerySet that will only iterate over users whose# 'country' field is set to 'uk'uk_users = User.objects(country='uk')
2.3. Defining documents
https://mongoengine-odm.readthedocs.io/guide/defining-documents.html#defining-a-document-s-schema
簡介:
mongo engine 的文檔沉颂。
如何定義一個schema.
MongoEngine allows you to define schemata for documents as this helps to reduce coding errors, and allows for utility methods to be defined on fields which may be present.
To define a schema for a document, create a class that inherits from Document. Fields are specified by adding field objects as class attributes to the document class:
from mongoengine import *
import datetime
class Page(Document):
title = StringField(max_length=200, required=True)
date_modified = DateTimeField(default=datetime.datetime.now)
Document collections
Document classes that inherit directly from Document will have their own collection in the database. The name of the collection is by default the name of the class, converted to lowercase (so in the example above, the collection would be called page). If you need to change the name of the collection (e.g. to use MongoEngine with an existing database), then create a class dictionary attribute called meta on your document, and set collection to the name of the collection that you want your document class to use:
class Page(Document):
title = StringField(max_length=200, required=True)
meta = {'collection': 'cmsPage'}
查詢:
MongoEngine 也提供用原生的mongo語句來查詢。
Raw queries
It is possible to provide a raw PyMongo query as a query parameter, which will be integrated directly into the query. This is done using the __raw__ keyword argument:
Page.objects(__raw__={'tags': 'coding'})
修改:
However, this doesn’t map well to the syntax so you can also use a capital S instead
Post.objects(comments__by="joe").update(inc__comments__S__votes=1)