本教程由 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平台上的诸多高级功能。
考虑到这一切,咱们就开始吧!
需要的前提要成功完成本教程,开发人员需要准备一系列前提条件。
- 在免费层级上创建一个 MongoDB Atlas 集群。请务必安全地保存连接字符串。下载示例数据集,本教程中会用到它。请确保集群的 IP 地址已被加入白名单,以保证正常连接。
- 一个集成开发环境(IDE)。本教程使用 VSCode 作为开发环境。
- Python 3.10+。
请确保按照下面的方式在连接字符串中加入样本数据集的名称,例如:
``
mongodb+srv://mongodb:PASSWORD>@cluster0.qh7j8.mongodb.net/
切换到全屏模式 退出全屏模式
我们在这个教程里使用的是 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
装饰器,用于处理 GET
和 POST
请求。
我们的路线是这样的:
@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
的新路由,并使用 GET
和 POST
方法。我们还需要在 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。
如有任何疑问,请在开发者社区论坛上联系我们。