65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 MongoDB 的简单 Python Flask 程序

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2018 年 8 月 6 日

CPOL

6分钟阅读

viewsIcon

37809

这是一个使用 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 个数据库(adminconfiglocal)。

现在我们将安装 Python 的 PyMongo 库。PyMongo 是一个简单但功能强大的 Python 发行版,包含用于处理 mongodb 的工具,并且是从 Python 中处理 mongodb 的推荐方式。它是一种 ODM(对象文档映射器)。还有 mongoengine 和许多其他库也可作为 Python 的 ODM。

>pip install pymongo

我们还需要安装另一个 Python 库 bson 。它用于获取 mongodb 文档的 objectId 属性。

>pip install bson

现在我们一切就绪,可以开始我们的 Python 程序了。

创建一个名为 FlaskwithMongo 的文件夹,并在其中添加两个子文件夹:statictemplates

jinja2 框架中,有一个命名约定,如 statictemplates

请在任何代码编辑器中打开该文件夹。我使用 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 变量在整个应用程序中使用。

现在我们将声明两个变量 titleheading,它们稍后将在 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_templaterequestredirecturl_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.htmlsearchlist.htmlupdate.html)。

这三个文件都使用了 jinja2 框架的特性来渲染 app.py 中的模型值。

此外,我们必须在 static\assets 文件夹中添加 emoji.cssemoji.jsstyle.csstwemoji.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 上找到。

简单的 Python Flask 程序配合 MongoDB - CodeProject - 代码之家
© . All rights reserved.