使用python的Flask框架实现疫情数据可视化

本文介绍了Flask,一个Python微框架,用于快速开发网站。讲解了其核心概念、WSGI和Jinja2的应用,以及如何进行基本测试和模板使用。通过实例展示如何在Flask中操作数据库和呈现动态页面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flask入门

Flask简介

Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架。Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask。Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。两者都是Pocco项目。

Flask也被称为“microframework” ,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。

适用人群

具有Python基础知识并且有开发网站需求的人员。

WSGI

Web Server Gateway Interface(Web服务器网关接口,WSGI)已被用作Python Web应用程序开发的标准。 WSGI是Web服务器和Web应用程序之间通用接口的规范。

jinja2

jinja2是Python的一个流行的模板引擎。Web模板系统将模板与特定数据源组合以呈现动态网页。Jinja2 需要至少 Python 2.4 版本来运行。

测试Flask

为了测试 Flask 安装,请在编辑器中将以下代码输入 test.py:

import Flask

app = Flask(__name__)

@app.route('/')
def test():
   return 'Hello World'
# Flask应用程序实例的run方法启动WEB服务器
if __name__ == '__main__':
   app.run()

必须在项目中导入Flask模块。

Flask类的一个对象是我们的WSGI应用程序。

Flask构造函数使用当前模块(__name __)的名称作为参数。

Flask类的route()函数是一个装饰器,装饰器的作用是将路由映射到视图函数

app.route(rule, options)
  • rule 参数表示与该函数的URL绑定。
  • options 是要转发给基础Rule对象的参数列表。

Flask类的run()方法在本地开发服务器上运行应用程序

app.run(host, port, debug, options)
  • host要监听的主机名。 默认为127.0.0.1(localhost)。设置为“0.0.0.0”以使服务器在外部可用。
  • port默认值为5000,也可使用其他端口。
  • debug默认为false, 如果设置为true,则提供调试信息。(Pycharm中不起作用)
  • options要转发到底层的Werkzeug服务器。

模板的使用

  • 模板就是预先写好的页面,里面可以使用特殊语法引入变量。
  • 使用 render_template 返回模板页面。

部分源码

utils.py

import pymysql


def get_conn():
    conn = pymysql.connect(host="127.0.0.1",
                           user="root",
                           password="root",
                           db="cov",
                           charset="utf8")
    cursor = conn.cursor()  
    return conn, cursor


def close_conn(conn, cursor):
    cursor.close()
    conn.close()


def query(sql, *args):
    conn, cursor = get_conn()
    cursor.execute(sql, args)
    res = cursor.fetchall()
    close_conn(conn, cursor)
    return res


def get_confirmed_data():
    sql = """
    SELECT total,total-heal-dead,heal,dead from (
    select sum(confirm) total, 
    (SELECT heal from history ORDER BY ds desc LIMIT 1) heal ,
      sum(dead) dead 
    from details where update_time=(
      select update_time from details order by update_time desc limit 1)
    ) d;
    """
    res = query(sql)
    return list(res[0])


def get_wordcloud_data():
    sql = 'select content from hotsearch order by id desc limit 30'
    res = query(sql)
    return res


def get_region_list():
    sql = 'SELECT update_time,province,city,confirm,confirm_add,confirm_now,heal,dead FROM details'
    res = query(sql)
    res = list(res)
    # print(res)
    # print(type(res))
    return res


def get_his_list():
    sql = 'SELECT ds,confirm,confirm_now,suspect,heal,heal_add,dead,dead_add FROM history'
    res = query(sql)
    res = list(res)
    # print(res)
    # print(type(res))
    return res


def get_area_data():
    sql = "select end_update_time,province,city,county,address,type" \
          " from risk_area " \
          "where end_update_time=(select end_update_time " \
          "from risk_area " \
          "order by end_update_time desc limit 1) "
    res = query(sql)
    return list(res)


def get_echarts_data():
    sql = 'SELECT province,confirm FROM ' \
          '(select province ,sum(confirm_now) as confirm from details  ' \
          'where update_time=(select update_time from details ' \
          'order by update_time desc limit 1) ' \
          'group by province) as a ' \
          'ORDER BY confirm DESC LIMIT 5'
    res = query(sql)
    return res

app.py

from flask import Flask, render_template
import utils

app = Flask(__name__)


@app.route('/')
def index():
    data_list = utils.get_confirmed_data()
    return render_template("index.html", data=data_list)


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


@app.route('/region')
def region():
    region_list = utils.get_region_list()
    return render_template("region.html", regions=region_list)


@app.route('/his')
def his():
    his_list = utils.get_his_list()
    return render_template("his.html", his=his_list)


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


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


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


@app.route('/area')
def area():
    area_list = utils.get_area_data()
    return render_template("area.html", area=area_list)


@app.route('/echarts')
def echarts():
    echarts_list = utils.get_echarts_data()
    city = []
    confirm = []
    for i, j in echarts_list:
        city.append(i)
        confirm.append(int(j))
    return render_template("echarts.html", city=city, confirm=confirm)


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

效果图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源码获取

百度网盘:链接
提取码:snzw

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

✎浅笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值