起步

1、 安装 Flask-MongoEngine

安装就简单啦,直接还是惯例得

pip install flask-mongoengine


2、快速入门使用
//test.py

from flask import Flask
from flask.ext.mongoengine import MongoEngine

app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
  'db': 'project1',
  'host': 'localhost',
  'port': 27017
}
db = MongoEngine(app)

class User(db.Document):
  email = db.StringField(required=True)
  username = db.StringField(max_length=30)
  password = db.StringField(required=True)


@app.route('/')
def user():
  user = User(email=liqianglau@outlook.com, username=Tyrael, password=admin)
  user.save()
  return str(user.id)


if __name__ == __main__:
  app.run()


注:这里假设你已经知道 flask 框架怎么使用
3、查看示例结果

将 test.py 放在任意目录,然后执行

python test.py


之后打开浏览器,输入网址:

http://localhost:5000/


你将会看到类似:5622699ec808b817ec4ad215 这个的结果,当然,你看到的字符串肯定和我的不一样,如果一样,那恭喜你,中大奖了,可以去买个彩票试试。但是,可以肯定的是,你的字符串也是 24 位长度的。

示例解析

像 flask 的固定语句我就不解释了,这个和 mongoengine 是没有太大关系的,有关系的主要是以下几句,我一一对他们进行解析:

app.config['MONGODB_SETTINGS'] = {
  'db': 'project1',
  'host': 'localhost',
  'port': 27017
}


这个是配置 mongoengine 的信息,例如主机、端口、数据名称等信息,如果有必要的话,还可以配置用户名和密码,额外的配置可以如下:

app.config['MONGODB_SETTINGS'] = {
  'db': 'project1',
  'host': 'localhost',
  'port': 27017,
  'username': 'admin',
  'password': 'admin'
}


这个就主要是连接信息了,这样赋值之后,我们的 app 变量的上下文中便有了 mongodb 的连接信息了。

接下来是下一句,

db = MongoEngine(app)


这句是创建 MongoEngine 实例,其实是创建一个与我们配置中的数据相匹配的实例,因为这里传入了变量 app,而我们知道 app 的上下文里面是包含了我们 MongoDB 的连接信息的。

不太明白?没有关系,看接下来的一段

class User(db.Document):
  email = db.StringField(required=True)
  username = db.StringField(max_length=30)
  password = db.StringField(required=True)


这一段便是在数据库中创建一个 Document ,名字叫做 User。在哪个数据库?看看这个 Class 继承自哪个父类先。

可以发现,这个 Class 继承自 db.Document,既然 User 是一个 MongoDB 中的 Document,那么继承自 Document 自然是理所应当,但是,为什么是 db.Document 呢?

db 是什么?看看上面,db 是 MongoEngine 的实例,实例的参数是 app,app 里面附带了我们的 MongoDB 的配置信息,那么,这样是不是一切都连接起来了?

其实这段的意思就是,在我们 app 中配置的 MongoDB 中给我创建一个名字叫做 User 的 Document 。

不知道你到这里看懂了我上面的解释没?没得话我希望你可以多揣摩两次领悟领悟。

接下来下面的就是怎么 CRUD 了。其实在 view 里面,我只做了一个 create 的操作,而没有 read、update 和 delete。

正如你说看到的,使用 MongoEngine 在数据库中插入一条数据就是这么简单:

user = User(email=liqianglau@outlook.com, username=Tyrael, password=admin)
user.save()


插入成功后,我们可以知道这个记录在数据库中的 id 是什么,这个 id 属性是 MongoEngine 自带的,每个 Document 都会有一个默认的 id,你可以通过 变量名.id 来访问,就如我代码中的一样

return str(user.id)


需要注意的是,MongoEngine 中的 id 是不能直接 return 的,因为它是不可序列化的,所以需要进行转换成 string 类型,这点很重要,尤其是很多时候你会做类似这样的一个操作:

return user


其实,这样是错误的,因为 user 里面包含 id,而 id 是不可序列化的,这样的话,user 也是不可序列的话的,从而导致这个 return 语句是会出错的。切记切记。

CRUD 介绍

方才已经对如何用 MongoEngine 往数据库中塞入一条记录进行介绍了,下面将 CRUD 中的另外三个 查询、更新和删除 进行一个介绍。

查询

在例子中,我们已经有了一个 User 对象了,也就是名字为 Tyrael 的用户,那么我想需要把这个用户从数据库中查询出来怎么办?可以试试下面的语句

User.objects(username=Tyrael)


这里有一个 objects 大家可能不太理解,其实在 MongoEngine 里面,每个 Document 对象都有一个 objects 属性,这个属性的值就是数据库中所有该 Document 的记录,然后括号里面的就是查询条件了。

如果要多条件查询的话,只管加记录就是了,例如

User.objects(username=Tyrael, email=liqianglau@outlook.com)


过滤器

OK,现在有一个问题,如果我想查询所有以 outlook 为邮箱的用户怎么办?确实有点棘手,这里我给大家带来一个新的概念,就是过滤器,我们知道了 objects 里面包含了 Document 的所有记录,那么我们将这些记录过滤出我们想要的记录,那么就叫过滤器。

那么对于刚才说的,如果查出使用 outlook 邮箱的用户,我们可以这么写,

User.objects(email__endswith('outlook.com'))


在这里可以发现,email 后面有两个下划线,这个在 MongoEngine 里面是有特殊含义的,也就是过滤器的意思,我们可以看到在两个下划线的后面跟着的是 endswith,其实也就表示,我想查询的是以 "outlook.com" 结尾的 email 的用户。

类似 endswith 的过滤器还有很多,更多的大家可以在这个页面(点此打开)查找。

更新

更新操作也很简单,我们 query 出我们想要的对象之后直接使用 update 函数更新字段即可,例如

user.update(password=admin123)


这样就更新了密码了。

当然,还有更复杂的 update 操作,这些以后有时间一一详解。

删除操作

类似于 update 操作,当我们 query 出想要的元素之后,直接使用 delete 函数即可删除对应的元素。

user.delete()


这样就删除了。

当然,对于重要的数据,其实我们是不鼓励直接 delete 的,更多的是给一个 Document 设置一个类似于 is_deleted 的字段,当有效的时候这个字段为 false,当删除的时候不是用 delete(),而是 update(is_deleted=True)。从而保存一些重要的记录。

OK,关于 Flask-MongoEngine 的简单介绍就到这了,希望能够帮助到大家,使大家对 Flask-MongoEngine 有一些更好的理解。