Flask+MongoDB数据库增删改查CRUD示例

Flask+MongoDB数据库增删改查实例

作为一个python+mongodb的小白摸索到这里蛮不容易的,网上教程很多,但是python/mongodb的版本差别导致网上爬到的教程也不好用,所有本文记录一下完整的适用于python3.5+mongodb3.4的一个简单的数据库操作实例.

PS: 这是一个非常非常简单的基础实例,不合理的地方不少,仅供学习参考.

开发环境

Vagrant(CentOS7 + Python 3.5 + MongoDB 3.4) + XShell + Windows 10 + Sublime Text 2

数据库环境

  • 主机: localhost (默认)
  • 端口: 27017 (默认)
  • 数据库名: todolist
  • 集合: todos
  • 用户名: todo
  • 密码: towait.com

数据库及账户的创建

根据我爬文若干的经验来看,网上的flask+mongodb教程基本上是MongoDB默认安装没有经过安全认证的配置,数据库连接不需要用户名和密码,在这篇文章中我曾经强调要做security参数的安全配置,具体操作访问前面的链接内容即可,本文使用的是需要数据库用户名和密码登录的场景.

下面直接我们进入正题

首先使用用户管理员账号登录MongoDB数据库

mongo -u admin -p --authenticationDatabase admin

注意,这里使用的是用户管理员的账号登录,这个账户在在MongoDB安装的时候应该被配置好的.

创建数据库

创建一个名为"todolist"的数据库

use todolist

创建用户

创建用户名为"todo"密码为"towait.com"并拥有数据库读写权限的账户

db.createUser({user: "todo", pwd: "towait.com", roles:[{role: "readWrite", db: "todolist"}]})

验证账户

创建成功后使用 quit() 命令退出当前账户并使用刚刚创建的账户登录到todolist数据库

mongo -u todo -p --authenticationDatabase todolist

登录成功后默认为test数据库,使用 use todolist 切换到目标数据库

创建集合

我们需要创建一个名为todos的集合

db.createCollection("todos", {capped: false})

至此已经成功创建了数据库/用户名/密码/集合等所需要的数据库信息.

更多数据库管理的相关命令在<>这篇文章里面均有记录,也可以翻阅参考.

Flask主程序

程序文件目录机构

todolist
----app.py
----templates
--------index.html
--------base.html

/app.py

from flask import Flask, jsonify, request, abort,url_for,render_template,redirect
from time import time
from bson.objectid import ObjectId
from bson.json_util import dumps
from flask_pymongo import PyMongo

app = Flask(__name__)

app.config['MONGO_DBNAME'] = 'todolist'

app.config['MONGO_URI'] = 'mongodb://todo:[email protected]:27017/todolist'

app.url_map.strict_slashes = False

mongo = PyMongo(app)


@app.route("/", methods=['GET'])
def home_page():
    return "<h1>Hello World!</h1>"


class Todo(object):
    @classmethod
    def create_doc(cls, content):
        return {
            'content': content,
            'created_at': time(),
            'is_finished': False,
            'finished_at': None
        }

@app.route('/todo/',methods=['GET'])
def index():
    todos = mongo.db.todos.find({})
    return  render_template('index.html',todos=todos)

@app.route('/todo/', methods=['POST'])
def add():
    content = request.form.get('content', None)
    if not content:
        abort(400)
    mongo.db.todos.insert(Todo.create_doc(content))
    return redirect('/todo/')

@app.route('/todo/<content>/finished')
def finish(content):
    result = mongo.db.todos.update_one(
        {'content':content},
        {
            '$set': {
                'is_finished': True,
                'finished_at': time()
            }
        }    
    )
    return redirect('/todo/')

@app.route('/todo/<content>')
def delete(content):
    result = mongo.db.todos.delete_one(
        {'content':content}
    )
    return redirect('/todo/')

@app.route('/todo/search/<content>')
def find(content):
    todos = mongo.db.todos.find(
        {'content': {"$regex": content}} 
    )
    return  render_template('index.html', todos=todos)

if __name__ == '__main__':
    app.run(debug=True)

/templates/index.html

{% extends 'base.html' %}
{% block content %}
<form action="{{ url_for('index') }}" method=post class=add-entry>
    <h2>todo list:</h2>
       <textarea name=content rows=2 cols=20></textarea>
       <input type=submit value=submit>
</form>
<ul>
    {% for todo in todos %}
    <li><p>{{todo.content}}
        <a href="{{ url_for('delete',content=todo.content)}}">delete</a>&nbsp&nbsp<a href="{{ url_for('finish',content=todo.content)}}">done</a></p>
        {%- if todo.is_finished -%}
                <p>finished</p>
        {%- else-%}
                <p>unfinished</p>
        {%- endif %}
    </li>
    {% endfor %}
</ul>
{% endblock %}

/templates/base.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
</head>
<body>
   {% block content %}
   {% endblock  %}
</body>
</html>

运行实例

切换至程序目录运行

python app.py

由于我在vagrant环境中运行,使用python命令运行发现端口没有转发到宿主电脑中,这个问题在一文中特地有说明,启动flask时需要加--host参数,于是有了下面的启动方法

export FLASK_APP=app.py 
flask run --host=0.0.0.0

启动后你可以使用 http://127.0.0.1:5000 在本地访问(我映射的端口是5050),访问根目录返回的应该是"hello world"的欢迎页,访问/todo/ 目录应该会出现相关表单内容,你可以删除或者设置任务状态,入下图

Flask+MongoDB数据库增删改查CRUD实例

访问URL http://127.0.0.1:5000/todo/search/{$keyword}可以对关键词的模糊搜索。

Read Comments

  • Eric2 weeks ago0

    赞一下这个。小,但是有内涵~

  • Julian2 weeks ago0

    希望能帮到你,感谢支持!

Post Comment