手记

用Flask-PyMongo搭建简单的CRUD应用教程

本教程由 MongoDB 的开发者倡导者 Anaiya Raisinghani 撰写

在这篇教程里,我们将直接上手使用 MongoDB 的 Flask-PyMongo 库!我们将构建一个基本的 CRUD(创建、读取、更新、删除)Flask-PyMongo 应用程序,并学习这个库如何直观地构建功能完整的 Flask 应用程序。

什么是Flask?

Flask 是一个非常轻量级的 web 应用框架,其设计使得创建简单的应用程序变得快速而简单。虽然它最初只是一个简单的封装,但它很快成为了最受开发者欢迎的 Python 框架之一,因为它易于上手,同时又支持扩展到复杂的应用。

由于 Flask 是一个微框架,它不提供数据库抽象层,并且核心保持简单且可扩展。这对开发人员来说是一个巨大的优势:Flask 不会强迫开发人员做出重大应用程序决策——开发人员仍然掌握控制权。

Flask-PyMongo插件

这个扩展因其多种原因而非常受欢迎。它支持无缝的Flask集成,开发人员可以直接利用PyMongo的功能,同时支持高级MongoDB功能。

这个库允许简单的配置选项。以前,开发人员需要额外的代码行数才能成功连接到他们的MongoDB后端,而现在,开发人员可以依赖Flask-PyMongo从他们的Flask应用配置中获取这些关键设置,如MONGO_URI。它使开发人员能够使用整个PyMongo API,这意味着开发人员可以利用PyMongo的所有功能来满足他们的数据库相关需求。它还支持MongoDB平台上的诸多高级功能。

考虑到这一切,咱们就开始吧!

需要的前提

要成功完成本教程,开发人员需要准备一系列前提条件。

  1. 在免费层级上创建一个 MongoDB Atlas 集群。请务必安全地保存连接字符串。下载示例数据集,本教程中会用到它。请确保集群的 IP 地址已被加入白名单,以保证正常连接。
  2. 一个集成开发环境(IDE)。本教程使用 VSCode 作为开发环境。
  3. Python 3.10+。

请确保按照下面的方式在连接字符串中加入样本数据集的名称,例如:

``
mongodb+srv://mongodb:PASSWORD>@cluster0.qh7j8.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0


切换到全屏模式 退出全屏模式

我们在这个教程里使用的是 sample_mflix 数据集。

## 步骤 1:创建虚拟环境

我们直接来创建我们的虚拟环境吧。

在你的根目录下,可以执行以下命令来创建一个名为 `venv` 的文件夹。

python3.12 -m venv venv # 这是用来创建虚拟环境的命令哦


进入全屏 退出全屏

接着,就启动它。

运行 venv/bin/activate


进入全屏,退出全屏

确认使用的Python版本是否正确:

python -V


点击全屏 点击退出全屏

本教程采用 Python 3.12.8 版。

虚拟环境设置好后,我们可以下载`Flask-PyMongo`了。

## 安装 Flask-PyMongo

在你的终端里,并在项目根目录下,运行如下命令:

这将安装Flask-PyMongo,一个用于连接MongoDB和Flask应用的扩展。```pip install Flask-PyMongo```

全屏显示,切换退出

安装好之后,确认您的 Flask 版本高于 3.0。同时,确认 PyMongo 版本高于 4.0。

太棒了!安装好之后,我们就可以创建我们的 `app.py` 文件。

## 创建一个 `app.py` 文件

首先,我们将放置导入语句。我们将使用`Flask`和`render_template`这两个库,并从`flask_pymongo`中导入`PyMongo`。
从 flask 导入 Flask, render_template。
从 flask_pymongo 导入 PyMongo。

全屏 退出全屏

我们也可以为 Flask 应用程序实例化一个名字:

```python
app = Flask(__name__) # 创建一个Flask应用实例

点击进入全屏模式 点击退出全屏模式

我们现在复制连接字符串。请记住这在实际生产环境中并不推荐,并确保妥善保管所有敏感信息。这只是为了教程的需要。为了增强安全性,建议将连接字符串保存到 .env 文件中。

CONNECTION_STRING = "mongodb+srv://mongodb:<PASSWORD>@cluster0.qh7j8.mongodb.net/sample_mflix?retryWrites=true&w=majority&appName=Cluster0"
app.config["MONGO_URI"] = CONNECTION_STRING
mongo = PyMongo(app)

进入全屏,退出全屏

在我们创建 app.route 之前,先创建一个名为 index.html 的文件。这样做,请创建一个名为 templates 的文件夹,然后创建一个名为 index.html 的文件。

你可以在这里输入你想要的任何CSS和HTML,用于显示首页上从app.route返回的sample_mflix集合中一些电影的标题和剧情简介。

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
       <meta charset="UTF-8">
       <title>电影清单</title>
    </head>
    <body>
       <h1>电影</h1>
       <ul>
           {% for movie in movies %}
               <li>
                   <strong>标题:</strong> {{ movie.title }} <br>
                   <strong>故事情节:</strong> {{ movie.plot }}
               </li>
           {% endfor %}
       </ul>
    </body>
    </html>

全屏模式。退出全屏。

现在我们已经准备好了 index.html 文件,可以设置 app.route 了。

@app.route("/")
# 主页路由
def home_page():
    # 从数据库中获取电影的信息,包括标题和剧情简介
    movies_lookup = mongo.db.movies.find(
        {},
        {"title": 1, "plot": 1}
    ).limit(5)
    # 将这些信息传递给index.html模板
    return render_template("index.html", movies=movies_lookup)

if __name__ == '__main__':
    # 运行应用,开启调试模式
    app.run(debug=True)

切换到全屏模式 退出全屏

我们将从我们的sample_mflix数据库中的movies集合里返回五个电影的标题和剧情。

保存之后,运行这条命令:

运行这个命令来启动应用:

python app.py

全屏模式 退出全屏

点击这个链接:http://127.0.0.1:5000/

故障排除:如果您在这里连接时遇到问题,请确认您的网络IP地址权限设置正确,并且在被提示输入时已正确加入数据库名称(sample_mflix)。

步骤四:插入一部电影

咱们给我们的电影收藏加一部新电影吧。为了做到这一点,我们会创建一个 add_movie 表单页面,用户可以在这里输入他们想输入的电影名字和剧情。

在你的 app.py 文件顶部添加 from flask import request。我们将为路径 /add_movie 创建一个新的 @app.route 装饰器,用于处理 GETPOST 请求。

我们的路线是这样的:

@app.route('/add_movie', methods=['GET', 'POST'])
def add_movie():
   if request.method == 'POST':
       # 提交表单
       title = request.form['title']
       plot = request.form['plot']

       # 创建新的电影信息,包括标题和剧情
       new_movie = {
           "title": title,
           "plot": plot
       }

       # 插入新电影
       mongo.db.movies.insert_one(new_movie)

       # 跳转到成功页面
       return render_template('add_movie_success.html', title=title, plot=plot)

   # 对于 GET 请求,只需加载表单页面
   return render_template('add_movie.html')

进入全屏模式 退出全屏

这里是我们add_movie.html页面的内容:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
       <meta charset="UTF-8">
       <title>添加新电影</title>
    </head>
    <body>
       <h1>添加新电影</h1>
       <form method="POST" action="{{ url_for('add_movie') }}">
           <label for="title">电影名称:</label>
           <input type="text" id="title" name="title" required><br><br>

           <label for="plot">剧情简介:</label>
           <textarea id="plot" name="plot" rows="4" cols="50" required></textarea><br><br>

           <button type="submit">提交电影信息</button>
       </form>
    </body>
    </html>

开启全屏 退出全屏

接着来看我们的 add_movie_success.html 页面:

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>电影已添加</title>
    </head>
    <body>
       <h1>您已成功添加电影到收藏里!</h1>
       <p><strong>剧情简介:</strong> {{ plot }}</p>
       <p><strong>标题:</strong> {{ title }}</p>
       <a href="{{ url_for('add_movie') }}">再添加一部电影</a>
    </body>
    </html>

切换到全屏模式 退出全屏

当我们运行这个应用程序并打开http://127.0.0.1:5000/add_movie时,
我们会看到如下界面:

先给它加个标题和情节吧。标题就用:“Anaiya的人生”。情节部分这样写:“Anaiya Raisinghani的人生”。

一进入,就会看到这样的:

当我们刷新首页时,无法看到最近添加的电影。最简单的解决办法是更新首页的路由设置,让它显示最近添加的五部电影。具体来说,按我们的ID字段排序来实现这一点。比如说,“-1”表示按ID降序排序。

@app.route("/")
def home_page():
   # 我们想要获取最近的5部电影:
   movies_lookup = (mongo.db.movies
       .find({}, {"title": 1, "plot": 1})
       .sort("_id", -1)
       .limit(5)
   )
   return render_template("index.html", movies=movies_lookup)

全屏 退出全屏

现在,当我们刷新首页的时候,我们就能看到我们的最新电影:

但是哎呀,我把“Life”这个词拼错了,现在我们来创建一个新的路径,这样我们就可以把这部电影更新一下了。

第五步:更新文件

我们将会以添加新电影时类似的方式来完成这项任务。我们将创建一个名为 /movie_update 的新路由,并使用 GETPOST 方法。我们还需要在 templates 文件夹中创建两个新的表单以供使用。最佳做法是使用 _id 更新文档,但为了简化操作并强调 Flask-PyMongo 库的功能,我们可以根据电影标题进行更新。这也是因为我们知道样本数据集中没有重复的电影标题。

我们先创建一下想要的路径吧:

    @app.route('/update_movie', methods=['GET', 'POST'])
    def update_movie():
       if request.method == 'POST':
           # 原有标题
           old_title = request.form['old_title'] 

           new_title = request.form['new_title']  
           new_plot = request.form['new_plot']    

           # 调用 MongoDB 的 update_one 方法
           result = mongo.db.movies.update_one(
               {"title": old_title}, # 过滤条件,用于找到现有的文档
               {"$set": {"title": new_title, "plot": new_plot}} # 需要更新的字段
           )

           # 显示我们所做的更改
           return render_template(
               'update_movie_success.html',
               old_title=old_title,
               new_title=new_title,
               new_plot=new_plot
           )

       # 如果是 GET 请求,只显示表单
       return render_template('update_movie.html')

点击全屏按钮进入全屏 按退出按钮退出全屏

我们的 update_movie.html 看起来会是这样的。

    <!DOCTYPE html>
    <html lang="en">
    <head>
       <meta charset="UTF-8">
       <title>更新电影信息</title>
    </head>
    <body>
       <h1>更新电影信息</h1>
       <form action="/update_movie" method="POST">
           <label for="old_title">当前电影标题:</label>
           <input type="text" id="old_title" name="old_title" required><br><br>

           <label for="new_title">新电影标题:</label>
           <input type="text" id="new_title" name="new_title"><br><br>

           <label for="new_plot">新剧情简介:</label><br>
           <textarea id="new_plot" name="new_plot" rows="4" cols="50"></textarea><br><br>

           <button type="submit">提交更新</button>
       </form>
    </body>
    </html>

全屏模式 退出

我们的更新成功的电影页面将会是这样的样子:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
       <meta charset="UTF-8">
       <title>电影已更新</title>
    </head>
    <body>
       <h1>电影已更新</h1>
       <p><strong>旧标题:</strong> {{ old_title }}</p>
       <p><strong>新标题:</strong> {{ new_title }}</p>
       <p><strong>新剧情:</strong> {{ new_plot }}</p>

       <a href="{{ url_for('home_page') }}">返回首页</a>
    </body>
    </html>

全屏模式 全屏退出

当我们打开http://127.0.0.0.1:5000/update_movie这个网址时,可以看到表单:

现在,我们可以把当前的标题“Anaiya的Lyfe”改为“Anaiya的生活”。原来叫“Anaiya的Lyfe”。我们可以在里面放入任何想放的内容,或者保持不变。

点击“返回首页”按钮,就能看到修改了!

步骤六:删除文档

现在,让我们看看我们怎样才能把这个电影从收藏中删除。我已经决定不再想在我的收藏里保留这部电影了。

我们可以通过创建一个新的路由 delete_movie 来再次完成这个操作。

@app.route('/delete_movie', methods=['GET', 'POST'])
def delete_movie():
   if request.method == 'POST':
       title = request.form['title']

       # 使用删除一个
       mongo.db.movies.delete_one({"title": title})

       返回 render_template('删除电影成功.html', title=title)

   # 如果是 GET 请求,就只显示表单
   返回 render_template('删除电影.html')

全屏 全屏退出

在这里,我们只是填写一个表单,输入想要删除的电影的标题。接着,我们会看到一个页面确认删除成功。

这是表单页面。

删除电影页面(delete_movie.html):

    <!DOCTYPE html>
    <html>
    <head>
       <meta charset="UTF-8">
       <title>移除电影</title>
    </head>
    <body>
       <h1>删除电影</h1>
       <form action="/delete_movie" method="POST">
           <label for="title">删除的电影标题:</label>
           <input type="text" id="title" name="title" required><br><br>
           <button type="submit">移除电影</button>
       </form>
    </body>
    </html>

进入全屏 退出全屏

delete_movie_success.html

    <!DOCTYPE html>
    <html>
    <head>
       <meta charset="UTF-8">
       <title>电影已删除</title>
    </head>
    <body>
       <h1>电影已成功删除!</h1>
       <p>该电影 "{{ title }}" 已被删除。</p>
       <a href="{{ url_for('home_page') }}">回到首页</a>
    </body>
    </html>

点击全屏按钮,或点击退出按钮

http://127.0.0.1:5000/delete_movie 这个网址。

现在,我们可以输入标题为“Anaiya’s Life”,接着点击“删除电影文件”。

当你成功删除了你的电影后,你会看到这样的页面。现在,点击首页,确认一下你的电影是否已经从列表中移除。

咱的电影被删掉了!

结尾

在这次教程里,我们使用Flask-PyMongo库成功创建了一个基本的CRUD(即创建、读取、更新和删除)应用程序。我们看到了使用这个库是多么简单直观!

如需更多信息,请访问docs

如有任何疑问,请在开发者社区论坛上联系我们。

0人推荐
随时随地看视频
慕课网APP