使用 MongoDB 的简单 Python Flask 程序





5.00/5 (2投票s)
这是一个使用 MongoDB 作为数据库的 Python Flask 程序示例。
引言
在本文中,我们将创建一个使用 MongoDB 作为数据库的简单 Python Flask 应用程序。
背景
我们使用 Flask 框架构建 REST API,同时使用 Pymongo 将 Flask 与 MongoDB 连接。
实现
我们将使用 Flask 框架和 MongoDB 创建一个示例 Python Web 应用程序。使用 Flask 和 MongoDB 都非常容易。
从 https://pythonlang.cn/downloads/ 下载 Python。
您可以选择自定义安装,以添加 Python 环境变量。
如果您选择默认安装,请手动设置这些变量。
请点击“Add Python 3.7 to PATH”选项。这将在环境变量中添加一个条目。
如果需要,您可以修改安装路径。请选择“Python to environment variables”。
成功安装后,如果您检查系统环境变量,您可以看到系统已添加以下两个条目。
我们安装了 Python 3.7 版本,因此添加了 Python 37-32。
另外请注意,Python37-32\Scripts 文件夹用于处理 Python 所需的附加包。
现在您可以在命令提示符中检查 Python 和 PIP 版本。PIP 是 Python 包索引的缩写,用于从我们的系统中安装、升级或删除额外的 Python 库。
> python --version and pip -- version
默认情况下,pip 版本可能不是 18。这是今天的最新版本。如果您的 pip 版本比它旧,请升级它。
>python -m pip install -U pip
现在我们将安装 Flask。Flask 是一个 Python Web 框架。Flask 为您提供工具、库和技术,让您能够用 Python 构建 Web 应用程序。
它的依赖项包括
Werkzeug
一个 WSGI 工具库jinja2
它是其模板引擎
WSGI 基本上是一个协议,定义了 Python 应用程序如何与 Web 服务器通信,从而可以在 CGI 之外用作 Web 应用程序。
Jinja2
用于在 Flask 应用程序中创建视图。它包含所有静态文件,如 HTML、CSS 和 JavaScript 文件。
首先,在命令提示符中使用 pip 命令安装 Flask。
>pip install Flask
这将从其全局存储库安装最新版本的 Flask
库,并在 Windows 计算机上,它会保存到以下文件位置
C:\Program Files (x86)\Python\Python37-32\Lib\site-packages
我们的示例应用程序使用 MongoDB
作为数据库。因此,我们将从以下 URL 下载 MongoDB
。
这是一个免费的社区版本。成功安装后,就可以运行 mongodb
实例了。
在运行 mongodb
实例之前,我们必须创建一个数据文件夹并在命令提示符中运行以下命令。
"C:\Program Files\MongoDB\Server\4.0\bin\mongod.exe" --dbpath="C:\mongo-data"
这里,C:\mongo-data 文件夹用于保存 mongodb
文件。
在 Windows 系统上安装 mongodb
时,您也可以选择 Compass Community Edition。
这是一个免费版本,可以帮助我们以图形方式处理 mongodb
数据库、集合(MongoDB 中的表)和文档(记录)。
默认情况下,mongodb
在 localhost 的 27017 端口上运行。
我们可以看到,在安装时自动创建了 3 个数据库(admin
、config
和 local
)。
现在我们将安装 Python 的 PyMongo
库。PyMongo
是一个简单但功能强大的 Python 发行版,包含用于处理 mongodb
的工具,并且是从 Python 中处理 mongodb
的推荐方式。它是一种 ODM(对象文档映射器)。还有 mongoengine
和许多其他库也可作为 Python 的 ODM。
>pip install pymongo
我们还需要安装另一个 Python 库 bson
。它用于获取 mongodb
文档的 objectId
属性。
>pip install bson
现在我们一切就绪,可以开始我们的 Python 程序了。
创建一个名为 FlaskwithMongo 的文件夹,并在其中添加两个子文件夹:static 和 templates。
在 jinja2
框架中,有一个命名约定,如 static 和 templates。
请在任何代码编辑器中打开该文件夹。我使用 Visual Studio Code 作为 IDE。
创建一个名为 app.py 的新文件。这是我们在此应用程序中使用的唯一 Python 文件。
首先,我们将把所需的库导入到我们的应用程序中。
from flask import Flask, render_template,request,redirect,url_for # For flask implementation
from bson import ObjectId # For ObjectId to work
from pymongo import MongoClient
import os
现在我们将声明程序中的 app 变量。
app = Flask(__name__)
此 app 变量在整个应用程序中使用。
现在我们将声明两个变量 title
和 heading
,它们稍后将在 jinja2
模板中使用。
title = "TODO sample application with Flask and MongoDB"
heading = "TODO Reminder with Flask and MongoDB"
我们必须声明 mongodb
的连接字符串并选择一个数据库。此外,我们将把我们的集合名称存储在一个变量中。
client = MongoClient("mongodb://127.0.0.1:27017") #host uri
db = client.mymongodb #Select the database
todos = db.todo #Select the collection name
正如我之前提到的,mongodb
默认在端口 27017 上运行。请注意,我们选择了 mymongodb
作为数据库,todo
作为集合名称。当我们进行第一次事务时,pymongo
会自动生成数据库和集合。与 SQL Server 或任何其他 RDBMS 不同,mongodb
不需要预定义的模式。
在 Flask 中,实现路由比任何其他编程语言都要容易。
为此,我们使用 render_template
、request
、redirect
和 url_for
。所有这些方法都有助于我们建立重定向并在浏览器中显示 HTML 模板。
def redirect_url():
return request.args.get('next') or \
request.referrer or \
url_for('index')
在上面的代码中,我们定义了一个名为 redirect_url
的方法,它用于将页面重定向到索引页。
@app.route("/")
@app.route("/uncompleted")
def tasks ():
#Display the Uncompleted Tasks
todos_l = todos.find({"done":"no"})
a2="active"
return render_template('index.html',a2=a2,todos=todos_l,t=title,h=heading)
在上面的代码中,我们定义了一个名为 tasks
的方法,它用于两个路由。一个用于默认的“/”路由,另一个用于“/uncompleted”路由。在此代码中,我们定义了一个名为 todos_l
的变量,它从 mongodb
获取文档,并通过条件 done 等于 no 进行过滤。我们还定义了一个名为 a2
的变量,它用于控制活动记录。todos_l
和 a2
变量以及另外两个变量 title 和 heading 被传递,并传递给 jinja2
模板 index.html,我们必须在模板文件夹中创建它。
现在我们将完成所有剩余的路由定义,以便将文档添加到 mongodb
并从中删除。
app.py
from flask import Flask, render_template,request,redirect,url_for # For flask implementation
from bson import ObjectId # For ObjectId to work
from pymongo import MongoClient
import os
app = Flask(__name__)
title = "TODO sample application with Flask and MongoDB"
heading = "TODO Reminder with Flask and MongoDB"
client = MongoClient("mongodb://127.0.0.1:27017") #host uri
db = client.mymongodb #Select the database
todos = db.todo #Select the collection name
def redirect_url():
return request.args.get('next') or \
request.referrer or \
url_for('index')
@app.route("/list")
def lists ():
#Display the all Tasks
todos_l = todos.find()
a1="active"
return render_template('index.html',a1=a1,todos=todos_l,t=title,h=heading)
@app.route("/")
@app.route("/uncompleted")
def tasks ():
#Display the Uncompleted Tasks
todos_l = todos.find({"done":"no"})
a2="active"
return render_template('index.html',a2=a2,todos=todos_l,t=title,h=heading)
@app.route("/completed")
def completed ():
#Display the Completed Tasks
todos_l = todos.find({"done":"yes"})
a3="active"
return render_template('index.html',a3=a3,todos=todos_l,t=title,h=heading)
@app.route("/done")
def done ():
#Done-or-not ICON
id=request.values.get("_id")
task=todos.find({"_id":ObjectId(id)})
if(task[0]["done"]=="yes"):
todos.update({"_id":ObjectId(id)}, {"$set": {"done":"no"}})
else:
todos.update({"_id":ObjectId(id)}, {"$set": {"done":"yes"}})
redir=redirect_url()
return redirect(redir)
@app.route("/action", methods=['POST'])
def action ():
#Adding a Task
name=request.values.get("name")
desc=request.values.get("desc")
date=request.values.get("date")
pr=request.values.get("pr")
todos.insert({ "name":name, "desc":desc, "date":date, "pr":pr, "done":"no"})
return redirect("/list")
@app.route("/remove")
def remove ():
#Deleting a Task with various references
key=request.values.get("_id")
todos.remove({"_id":ObjectId(key)})
return redirect("/")
@app.route("/update")
def update ():
id=request.values.get("_id")
task=todos.find({"_id":ObjectId(id)})
return render_template('update.html',tasks=task,h=heading,t=title)
@app.route("/action3", methods=['POST'])
def action3 ():
#Updating a Task with various references
name=request.values.get("name")
desc=request.values.get("desc")
date=request.values.get("date")
pr=request.values.get("pr")
id=request.values.get("_id")
todos.update({"_id":ObjectId(id)}, {'$set':{ "name":name, "desc":desc, "date":date, "pr":pr }})
return redirect("/")
@app.route("/search", methods=['GET'])
def search():
#Searching a Task with various references
key=request.values.get("key")
refer=request.values.get("refer")
if(key=="_id"):
todos_l = todos.find({refer:ObjectId(key)})
else:
todos_l = todos.find({refer:key})
return render_template('searchlist.html',todos=todos_l,t=title,h=heading)
if __name__ == "__main__":
app.run()
我们必须在 templates 文件夹中添加以下三个 HTML 文件(index.html、searchlist.html 和 update.html)。
这三个文件都使用了 jinja2
框架的特性来渲染 app.py 中的模型值。
此外,我们必须在 static\assets 文件夹中添加 emoji.css、emoji.js、style.css 和 twemoji.min.js 文件。
static\images 文件夹中有两张图片:no.png 和 yes.png。
我们已经准备好运行我们的示例应用程序了。
请使用以下命令启动我们的 mongodb
实例
"C:\Program Files\MongoDB\Server\4.0\bin\mongod.exe" --dbpath="C:\mongo-data"
请注意,mongodb
现在使用数据文件夹 C:\mongo-data 运行。
默认情况下,它监听端口 27017。
请在同一个 Python 应用程序文件夹中打开另一个命令提示符窗口,并使用以下命令运行 Python。
例如
D:\Python\FlaskWithMongo>python app.py
我们的本地 Web 服务器默认在端口 5000 上运行。
应用程序现已成功运行。
您现在可以添加一个示任务,任务名称为“Test task for mongo with flask application”,描述为“Sample description”,日期为“05-08-2018”,优先级为“High”。
点击“Create”按钮后,我们就可以立即在网格中查看任务详细信息。
请注意,现在创建了一个名为 mymongodb
的新数据库和名为 todo
的集合。使用此应用程序,您可以轻松地编辑和删除现有文档。
您也可以在 MongoDB Compass Community 中查看文档详细信息。
祝您在使用 Flask 和 MongoDB 编码愉快!!!
源代码可在 Github 上找到。