Flask 链接 Redis 数据库

本节使用 Flask 完成一个访问 Redis 数据库的例子,通过浏览器向用户提供界面,在服务端使用 Flask 完成增、删、改、查 Redis 数据库的操作。

传统的关系数据库在超大规模和高并发类型的 web2.0 纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。Redis 是是一个高性能的 key-value 数据库,可以有效应对高并发、大数据量访问的难题。

1. 程序功能介绍

程序提供了如下功能:

  • 向 Redis 数据库中插入一条数据;
  • 向 Redis 数据库中批量插入多条数据;
  • 从 Redis 数据库中删除指定数据;
  • 修改 Redis 数据库中的现有数据;
  • 从 Redis 数据库中查询所有的数据。

用户通过浏览器对 Redis 数据库进行操作,界面如下所示:

图片描述

2. 源程序下载

例子包括 3 个源文件,如下表所示:

源文件 说明
app.py Flask 后端程序,对 Redis 数据库进行操作
templates/index.html 首页模板,提供增、删、改、查的操作界面
templates/query.html 查询结果模板,返回当前数据库中的内容

3. 首页模板

首页模板 templates/index.html 展示了对 Redis 数据库增、删、改、查的操作界面,templates/index.html 分为 5 个部分:

3.1 查询数据

<html>
<head>
<meta charset="UTF-8">
</head>
<body>

<h2>查询数据</h2>
<form action="/query", method="post">
    <input type="submit" value="查询">
</form>

在第 2 行,定义表单 form 描述了查询数据的界面,使用 POST 方法提交给服务端的 /query 页面进行处理。

3.2 插入数据

<h2>插入数据</h2>
<form action="/insert", method="post">
    <input type="text" name="key" placeholder="键名">
    <input type="text" name="value" placeholder="键值">
    <input type="submit" value="插入">
</form>

在第 2 行,定义表单 form 描述了插入数据的界面,使用 POST 方法提交给服务端的 /insert 页面进行处理;在第 3 行和第 4 行,表单中包含有两个字段 key 和 value,作为插入 Redis 数据库的键和值。

3.3 批量插入数据

<h2>批量插入数据</h2>
<form action="/insertMulti", method="post">
    <input type="text" name="keyA" placeholder="键名">
    <input type="text" name="valueA" placeholder="键值">
    <br>
    <input type="text" name="keyB" placeholder="键名">
    <input type="text" name="valueB" placeholder="键值">
    <input type="submit" value="插入">
</form>

在第 2 行,定义表单 form 描述了插入数据的界面,使用 POST 方法提交给服务端的 /insertMulti 页面进行处理;在第 3 行和第 4 行,表单中包含有两个字段 keyA 和 valueA;在第 6 行和第 7 行,表单中包含有两个字段 keyB 和 valueB;这两组键值对:keyA 和 valueA、keyB 和 valueB 会被批量插入到 Redis 数据库。

3.4 删除数据

<h2>删除数据</h2>
<form action="/delete", method="post">
    <input type="text" name="key" placeholder="键名">
    <input type="submit" value="删除">
</form>

<h2>删除所有数据</h2>
<form action="/deleteAll", method="post">
    <input type="submit" value="删除">
</form>

在第 2 行,定义表单 form 描述了删除数据的界面,使用 POST 方法提交给服务端的 /delete 页面进行处理;在第 3 行,表单中包含字段 key,指定被删除的键。

在第 8 行,定义表单 form 描述了删除所有数据的界面,使用 POST 方法提交给服务端的 /deleteAll 页面进行处理。

3.5 修改数据

<h2>修改数据</h2>
<form action="/update", method="post">
    <input type="text" name="key" placeholder="键名">
    <input type="text" name="value" placeholder="键值">
    <input type="submit" value="修改">
</form>

</body>
</html>

在第 2 行,定义表单 form 描述了修改数据的界面,使用 POST 方法提交给服务端的 /update 页面进行处理;在第 3 行和第 4 行,表单中包含有两个字段 key 和 value,作为修改 Redis 数据库的键和值。

4. 查询结果模板

查询结果页面返回 Redis 数据库中全部的键值对,页面模板文件 templates/query.html 的内容如下:

<html>
<head>
<meta charset="UTF-8">
</head>

<body>
<h1>全部的键值对</h1>
<table border=1 cellpadding=0>
    <tr>
        <td></td>
        <td></td>
    </tr>
    {% for key in dict %}
    <tr> 
        <td>{{ key }}</td>
        <td>{{ dict[key] }}</td>
    </tr> 
    {% endfor %}
</table>
<br>
<a href="/">返回主页</a>
</body>
</html>

在第 8 行,定义了一个 table,使用 table 显示全部的键值对,table 包含 2 列,第 1 列显示键,第 2 列显示值;在第 13 行,Flask 程序传递给页面模板一个参数 dict,参数 dict 包含有 Redis 数据库的键值对,使用 for 循环显示 dict 中的键值对。

假设 Redis 数据库中包括 3 个键值对:

  • ‘www’:‘WWW’;
  • ‘imooc’:‘IMOOC’;
  • ‘com’:‘COM’。

则 /query 界面如下图所示:

图片描述

5. 后端 Flask 程序

服务端的 Flask 程序 app.py 提供了对 Redis 数据库增、删、改、查的操作。

5.1 安装相关模块

flask 操作 Redis 数据库需要使用 redis 第三方模块,redis 需要单独安装,如果你的环境中没有 redis,可以使用下面这条命令安装:

$ pip3 install redis

5.2 引入相关模块

#!/usr/bin/python3
from flask import Flask, render_template, request
import redis

app = Flask(__name__)
db = redis.Redis(host='localhost', decode_responses=True)

首先引入模块 flask 和 redis,其中 flask.request 对象用于获取表单参数。

在第 6 行,创建 Redis 数据库连接对象,在默认情况下,Redis 数据库返回的结果是字节,通过设定参数 decode_responses=True 使 Redis 返回字符串。

5.2 展示首页面

@app.route('/')
def index():
    return render_template('index.html')

访问首页面时,使用函数 index () 进行处理,函数 index () 渲染模板文件 index.html。

5.3 查询数据

@app.route('/query', methods = ['post'])
def query():
    keys = db.keys()
    dict = {}
    for key in keys:
        value = db.get(key)
        dict[key] = value
    return render_template('query.html', dict = dict)

用户查询数据时,通过 POST 方法将表单提交给 /query 页面,Flask 应用将请求转发给函数 query () 处理。

函数 query () 通过调用 db.keys () 获取 Redis 数据库中所有的键,调用 db.get (key) 获取键对应的值,创建一个字典 dict 存储查询结果,最后将 dict 作为参数传递给模板 query.html,模板 query.html 以 table 的形式展现键值对,如下图所示:

图片描述

5.4 插入数据和修改数据

@app.route('/insert', methods = ['post'])
@app.route('/update', methods = ['post'])
def insert():
    key = request.form['key']
    value = request.form['value']
    db.set(key, value)
    return query()

在 Redis 数据库中,插入数据和修改数据使用相同的操作,因此可以使用相同的函数处理插入数据和修改数据。在第 3 行,定义了函数 insert,它是两个页面的处理函数:

  • 用户插入单条数据时,通过 POST 方法将表单提交给 /insert 页面,Flask 应用将请求转发给函数 insert () 处理;
  • 用户修改数据时,通过 POST 方法将表单提交给 /update 页面,Flask 应用将请求转发给函数 insert () 处理。

通过 request.form [‘key’] 获取表单中的 key 字段,通过 request.form [‘key’] 获取表单中的 value 字段,使用 db.set (key, value) 将键值对插入到 Redis 数据库中。

最后,调用函数 query () 返回数据库查询的结果,结果会显示出新插入的键值对。

@app.route('/insertMulti', methods = ['post'])
def insertMulti():
    keyA = request.form['keyA']
    valueA = request.form['valueA']
    keyB = request.form['keyB']
    valueB = request.form['valueB']
    db.mset({keyA:valueA, keyB:valueB})
    return query()

用户插入多条数据时,通过 POST 方法将表单提交给 /insertMulit 页面,Flask 应用将请转发给函数 insertMulti () 处理。表单中包含有 2 组键值对:keyA 与 valueA、keyB 与 valueB,使用 db.mset ({keyA:valueA, keyB:valueB}) 将这 2 组键值对批量插入到 Redis 数据库中。

最后,调用函数 query () 返回数据库查询的结果,即数据库当前包含有哪些键值对。

5.5 删除数据

@app.route('/delete', methods = ['post'])
def delete():
    key = request.form['key']
    db.delete(key)
    return query()

用户删除单条数据时,通过 POST 方法将表单提交给 /delete 页面,Flask 应用将请转发给函数 delete () 处理。函数 delete () 调用 db.delete (key) 删除数据库中指定的键。

最后,调用函数 query () 返回数据库查询的结果,即数据库当前包含有哪些键值对。

@app.route('/deleteAll', methods = ['post'])
def deleteAll():
    db.flushall()
    return query()

用户删除全部数据时,通过 POST 方法将表单提交给 /deleteAll 页面,Flask 应用将请转发给函数 deleteAll () 处理。函数 deleteAll () 调用 db.flushall () 删除数据库中全部的键值对。

最后,调用函数 query () 返回数据库查询的结果,即数据库当前包含有哪些键值对。

5.6 启动 Flask 程序

最后调用 app.run () 启动 Flask 程序:

app.run()

6. 小结

本节讲解了访问 redis 数据库的相关 API,使用思维导图概括如下:

图片描述