Flask+MongoDB数据库增删改查CRUD示例
作为一个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默认安装没有经过安全认证的配置,数据库连接不需要用户名和密码,在这篇MongoDB数据库的安装及基本配置使用(CentOS7)文章中我曾经强调要做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})
至此已经成功创建了数据库/用户名/密码/集合等所需要的数据库信息.
更多数据库管理的相关命令在<MongoDB数据库管理常用命令>这篇文章里面均有记录,也可以翻阅参考.
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:towait.com@localhost: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>  <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在Vagrant中端口转发失败的解决方法一文中特地有说明,启动flask时需要加--host
参数,于是有了下面的启动方法
export FLASK_APP=app.py flask run --host=0.0.0.0
启动后你可以使用 http://127.0.0.1:5000
在本地访问(我映射的端口是5050),访问根目录返回的应该是"hello world"的欢迎页,访问/todo/ 目录应该会出现相关表单内容,你可以删除或者设置任务状态,入下图
访问URL http://127.0.0.1:5000/todo/search/{$keyword}
可以对关键词的模糊搜索。