公告推出 MongoDB 8.0,史上最快的 MongoDB!阅读更多 >>推出 MongoDB 8.0,史上最快的 MongoDB!>>

如何设置Flask与MongoDB

Flask 是一种广泛使用的 Python 框架,用于构建 Web 应用程序。它允许 Python 开发者使用他们喜欢的语言,同时构建可扩展且快速启动的 Python Web 应用程序。 MongoDB Atlas 是 MongoDB 的数据库即服务平台,允许开发者以更快的速度开发复杂数据。MongoDB Atlas 平台易于 设置 和扩展,使其成为 Web 应用程序的完美数据库。

将 Flask 应用程序与 MongoDB 集成可创建一个强大且可扩展的应用程序堆栈。本文将指导您如何将您的 Flask 应用程序连接到 MongoDB Atlas。

PyMongo 对 Flask 的支持

PyMongo 是官方的 MongoDB Python 驱动程序。任何 Python 应用程序都可以通过导入它并使用 MongoClient 实例来消耗 PyMongo 驱动程序。Flask 应用程序可以利用 PyMongo 访问我们的 MongoDB Atlas 数据库。

由于 Flask 的核心是提升开发者在开发 Web 应用程序时的体验,社区创建了一个广泛使用的辅助工具 Flask-PyMongo,这是一个围绕 PyMongo 的包装器,与 Flask 紧密集成。本文将使用此框架来处理 MongoDB Atlas 中可用的免费层集群,让您可以免费尝试此堆栈。

开始使用 Flask-PyMongo

Mflix 应用程序是 MongoDB 大学上已知的一个电影浏览示例应用程序 MongoDB University。整个示例项目位于我们的 mongodb-developer/flask-pymongo-example github 仓库中。

您可以将此项目克隆出来,通过 README 来设置您的演示应用程序,或者按照本文的指导学习这个项目的关键部分。

为了展示一个与 Atlas 集成的 Flask 应用程序示例,我们将使用 MongoDB Atlas 示例数据集中的 sample_mflix 数据库。Mflix 应用程序的前端将使用 Flask-PyMongo 库,一起探索基本的创建、读取、更新和删除(CRUD)操作,以及文本搜索和聚合。

"mflix" application screenshot

此项目使用一个 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- 存放本项目运行所需依赖的位置。

如何安装Flask与PyMongo

项目使用标准的pip安装需求文件,列出所需的依赖的最新版本

requirements.txt

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中找到。以下步骤将向您展示如何获取您的连接字符串

  1. 访问Atlas UI并确保您已登录到您的帐户。
  2. 确保您在“Clusters”页面。它应该是默认页面,如果不是,请从页面左侧菜单中选择它。

    Go to your cluster page

  1. 单击您之前创建的集群的“连接”按钮。

    Click the connect button.

  1. 选择“连接您的应用程序。”

    Connect your application.

  1. 将提供的连接字符串复制到创建代码中,用您的详细信息替换任何<>< >中的值,例如<><密码>。

    Copy the connection string.

启动应用程序

在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和Flask存储数据

所有数据库访问都通过初始化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)

上述函数接收评论属性并将一个文档插入到评论集合中。

读取

可以通过查询使用 findfind_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 来构建您自己的应用程序。

常见问题解答

我可以用Flask使用MongoDB吗?

MongoDB与使用PyMongo驱动程序的Flask应用程序配合得很好。此外,Flask-PyMongo助手可以帮助简化集成。

Flask在Python中有什么用途?

Flask是一个用于使用Python构建Web应用程序的框架。

如何使用Python Flask与MongoDB交互?

由于Flask是我们的Python应用程序的Web框架,因此PyMongo或Flask-PyMongo将提供我们访问MongoDB数据库所需的访问权限。

如何安装Flask-PyMongo?

您可以使用PyMongo网站上的可用 安装方法 之一安装相关驱动程序。

如何在Python中使用PyMongo?

请参阅此处 获取有关如何将驱动程序导入Python模块或应用程序的更多信息。