Flask 是一种广泛使用的 Python 框架,用于构建 Web 应用程序。它允许 Python 开发者使用他们喜欢的语言,同时构建可扩展且快速启动的 Python Web 应用程序。 MongoDB Atlas 是 MongoDB 的数据库即服务平台,允许开发者以更快的速度开发复杂数据。MongoDB Atlas 平台易于 设置 和扩展,使其成为 Web 应用程序的完美数据库。
将 Flask 应用程序与 MongoDB 集成可创建一个强大且可扩展的应用程序堆栈。本文将指导您如何将您的 Flask 应用程序连接到 MongoDB Atlas。
PyMongo 是官方的 MongoDB Python 驱动程序。任何 Python 应用程序都可以通过导入它并使用 MongoClient 实例来消耗 PyMongo 驱动程序。Flask 应用程序可以利用 PyMongo 访问我们的 MongoDB Atlas 数据库。
由于 Flask 的核心是提升开发者在开发 Web 应用程序时的体验,社区创建了一个广泛使用的辅助工具 Flask-PyMongo,这是一个围绕 PyMongo 的包装器,与 Flask 紧密集成。本文将使用此框架来处理 MongoDB Atlas 中可用的免费层集群,让您可以免费尝试此堆栈。
Mflix 应用程序是 MongoDB 大学上已知的一个电影浏览示例应用程序 MongoDB University。整个示例项目位于我们的 mongodb-developer/flask-pymongo-example github 仓库中。
您可以将此项目克隆出来,通过 README 来设置您的演示应用程序,或者按照本文的指导学习这个项目的关键部分。
为了展示一个与 Atlas 集成的 Flask 应用程序示例,我们将使用 MongoDB Atlas 示例数据集中的 sample_mflix 数据库。Mflix 应用程序的前端将使用 Flask-PyMongo 库,一起探索基本的创建、读取、更新和删除(CRUD)操作,以及文本搜索和聚合。
此项目使用一个 UI 层,在 ReactJS 前端 中进行压缩,并使用 Python Flask 应用程序托管前端,后端 API 用于访问电影数据库。
mflix
目录包含应用程序逻辑。这包括
db.py
- 所有数据库 CRUD 模式作为函数公开的位置。这也是 Flask-PyMongo 辅助工具用于与 MongoDB Atlas 交互的位置。api/movies.py
- Web API 向 UI 公开的位置,并将请求路由到适当的数据库函数。主目录包含以下文件
run.py
- Flask 应用程序初始化和配置加载的位置。sample_ini
- 配置MongoDB Atlas连接URI的位置。requirements.txt
- 存放本项目运行所需依赖的位置。项目使用标准的pip安装需求文件,列出所需的依赖的最新版本
Flask
pymongo[srv]
Flask-PyMongo
这些将允许我们使用Flask-PyMongo Helper将Flask应用实例与PyMongo客户端连接起来,如 db.py文件中所示
import bson
from flask import current_app, g
from werkzeug.local import LocalProxy
from flask_pymongo import PyMongo
from pymongo.errors import DuplicateKeyError, OperationFailure
from bson.objectid import ObjectId
from bson.errors import InvalidId
def get_db():
"""
Configuration method to return db instance
"""
db = getattr(g, "_database", None)
if db is None:
db = g._database = PyMongo(current_app).db
return db
# Use LocalProxy to read the global db instance with just `db`
db = LocalProxy(get_db)
上述代码使用从.ini文件中读取的MONGO_URI初始化全局“db”对象一次
config = configparser.ConfigParser()
config.read(os.path.abspath(os.path.join(".ini")))
if __name__ == "__main__":
app = create_app()
app.config['DEBUG'] = True
app.config['MONGO_URI'] = config['PROD']['DB_URI']
app.run()
我们将用相关的Atlas集群连接字符串替换模板sample_ini文件
[PROD]
DB_URI = mongodb+srv://<username>:<password>@<your-atlas-cluster-address>/sample_mflix
为了创建客户端,您需要传递访问数据库的连接字符串。
连接字符串可以在Atlas UI中找到。以下步骤将向您展示如何获取您的连接字符串
确保您在“Clusters”页面。它应该是默认页面,如果不是,请从页面左侧菜单中选择它。
单击您之前创建的集群的“连接”按钮。
选择“连接您的应用程序。”
将提供的连接字符串复制到创建代码中,用您的详细信息替换任何<>< >中的值,例如<><密码>。
在Python中使用虚拟环境是一种良好的实践,因此对于我们的示例应用程序,让我们创建一个名为mflix_venv
的虚拟环境:
# clone the github repo
git clone [email protected]:mongodb-developer/flask-pymongo-example.git
# navigate to the project directory
cd flask-pymongo-example
# create the virtual environment for MFlix
python3 -m venv mflix_venv
# activate the virtual environment
source mflix_venv/bin/activate
python3 -m pip install -r requirements.txt
编辑sample_ini以包含您的Atlas连接字符串
[PROD]
DB_URI = mongodb+srv://<username>:<password>@sandbox.abcd.mongodb.net/sample_mflix
将sample_ini重命名为.ini文件
mv sample_ini .ini
启动应用程序
python ./run.py
这将输出有关服务器启动和状态的控制台消息。您的应用程序应可通过浏览器在https://127.0.0.1:5000上访问。
所有数据库访问都通过初始化PyMongo客户端的全局“db”对象进行路由。特殊变量对象“g”在此用于在全局应用程序上下文中定义PyMongo数据库。
db = g._database = PyMongo(current_app).db
在MongoDB中,信息以BSON文档的形式存储。BSON是一种类似于JSON的二进制结构。它支持与JSON相同的数据类型,还有一些额外的数据类型,例如日期、原始二进制,以及更多的数字类型,如整数、长整型和浮点数。
集合是MongoDB在单个容器中存储的一组文档。让我们来看看基本的创建、读取、更新和删除操作。
可以通过集合对象和insert_one 方法来创建文档。让我们看看“add_comment”函数
def add_comment(movie_id, name, email, comment, date):
"""
Inserts a comment into the comments collection, with the following fields:
- "name"
- "email"
- "movie_id"
- "text"
- "date"
Name and email must be retrieved from the "user" object.
"""
comment_doc = { 'movie_id' : movie_id, 'name' : name, 'email' : email,'text' : comment, 'date' : date}
return db.comments.insert_one(comment_doc)
上述函数接收评论属性并将一个文档插入到评论集合中。
可以通过查询使用 find 或 find_one 来读取MongoDB中的数据,分别返回文档的游标或单个文档。另一种选择是使用 聚合 来执行更复杂的搜索或数据重构。有关聚合的更多信息,请参阅此 文档。
我们的应用程序查询可以使用find和aggregate方法过滤电影
在 get_movies
中进行查找
cursor = db.movies.find(query).sort(sort)
find方法正在搜索电影集合,并根据用户输入提供查询条件和排序文档。请参阅db.py文件中的此代码。
在 get_all_genres
中进行聚合
def get_all_genres():
"""
Returns list of all genres in the database.
"""
return list(db.movies.aggregate([
{"$unwind": "$genres"},
{"$group": {"_id": None, "genres": {"$addToSet": "$genres"}}}
]))[0]["genres"]
聚合操作 unwinds 每个文档中的流派数组,并计算可能的流派列表。
要更新文档,集合对象可以使用 update_one 方法。在我们的示例中,我们提供了用于文本和评论日期的过滤器和更新值
def update_comment(comment_id, user_email, text, date):
"""
Updates the comment in the comment collection. Queries for the comment
based by both comment _id field as well as the email field to doubly ensure
the user has permission to edit this comment.
"""
response = db.comments.update_one(
{ "comment_id": comment_id },
{ "$set": { "text ": text, "date" : date } }
)
return response
要删除文档,集合对象可以使用 delete_one 方法。在我们的示例中,我们提供了要删除的评论的_id。
def delete_comment(comment_id, user_email):
"""
Given a user's email and a comment ID, deletes a comment from the comments
collection
"""
response = db.comments.delete_one( { "_id": ObjectId(comment_id) } )
return response
Flask、PyMongo和MongoDB Atlas提供了一个很好的堆栈来构建您的Web Python应用程序,并且可以轻松地进行扩展和托管。使用本指南,您今天就可以开始使用 MongoDB Atlas 来构建您自己的应用程序。
MongoDB与使用PyMongo驱动程序的Flask应用程序配合得很好。此外,Flask-PyMongo助手可以帮助简化集成。
请参阅此处 获取有关如何将驱动程序导入Python模块或应用程序的更多信息。