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

作者:Julian @ 恒馨博客
转载:https://towait.com/blog/flask-mongodb-crud/

本文记录一下完整的适用于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>&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在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/ 目录应该会出现相关表单内容,你可以删除或者设置任务状态,入下图

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

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

猜你喜欢

转载自www.cnblogs.com/weijiangping/p/9358123.html