Python+Dash快速web应用开发——基础概念篇
作者:费弗里
来源:Python大数据分析
❝本文示例代码与数据已上传至https://github.com/CNFeffery/DataScienceStudyNotes
❞
1 简介
这是我的新系列教程「Python+Dash快速web应用开发」的第一期,我们都清楚学习一个新工具需要一定的动力,那么为什么我要专门为Dash
制作一个系列教程呢?
图1
Dash
是一个高效简洁的Python
框架,建立在Flask
、Poltly.js
以及React.js
的基础上,设计之初是为了帮助「前端知识匮乏」的数据分析人员,以纯Python
编程的方式快速开发出交互式的数据可视化web应用。
Dash
已经过数年的迭代发展,早期的Dash
我也体验过,但当时还比较简陋,很多问题亟待解决,因此并没有引起我的多大注意。
但随着近一两年的高速发展和积极更新迭代,现阶段的Dash
已经是一个相当成熟的框架,且其功能已经丰富到不仅仅可以用来开发在线数据可视化作品,即使是轻量级的数据仪表盘、BI应用,甚至是搭建文档说明、博客或常规的网站,都驾驭得住,配合丰富的第三方拓展,只会Python
的你可以开发出相当精美正式的web应用。
图2
而关于Dash
的像样的中文教程几乎没有(其实英文教程也没多少????),有的也大多只是在照搬官方文档,因此类似之前写作完成反响不错的geopandas教程那样,我来写一个看得过去的系列教程吧~下面开始我们的Dash
之旅吧!
2 Dash中的基础概念
在学习Dash
的一开始,我们需要对Dash
的若干基础概念进行了解,首先我们来从头开始搭建Dash
环境,因为主要是面向数据分析处理人员,所以我推荐使用conda
进行环境管理,参考下列命令即可完成环境的初始化:
conda create -n dash-dev python=3.7 -y
conda activate dash-dev
pip install dash -U
上述代码执行完成后,你就已经创建好最基本的Dash
运行所需环境了,你可以创建代码如下的py
脚本并执行(推荐使用pycharm
、vscode
等工具进行Dash
开发):
❝
app1.py
❞
import dash
import dash_html_components as htmlapp = dash.Dash(__name__)app.layout = html.H1('第一个Dash应用!')if __name__ == '__main__':app.run_server()
运行上述脚本之后,一切正常的话,按照提示点击进对应网址会看到如下内容:
图3
至此我们就完成了Dash
环境的搭建,下面我们来了解Dash
应用中的一些基础概念:
2.1 用layout设计页面内容
一个web应用的关键之一在于其前端所呈现的页面内容,在Dash
中我们通过对其layout
属性进行定义,从而自由设计页面内容。
在前面的app1.py
中,我们设置了app.layout = html.H1('第一个Dash应用!')
,这里的html
即开头导入的dash_html_components
,它是dash
的自带依赖库,用于在Dash
应用中定义常见的html
元素,就像前面用到的H1
对应一级标题,即<h1></h1>
标签。
而每个html.XX
对象,其接收的第一个位置上的参数都是children
,它用于表示对应html
标签所包裹的内容,譬如上文的'第一个Dash应用!'
,也可以通过传入多元素列表或进行多层嵌套,从而构建结构更复杂的页面内容,就像下面的例子一样:
❝
app2.py
❞
import dash
import dash_html_components as htmlapp = dash.Dash(__name__)app.layout = html.Div([html.H1('标题1'),html.H1('标题2'),html.P(['测试', html.Br(), '测试']),html.Table(html.Tr([html.Td('第一列'),html.Td('第二列')]))]
)if __name__ == '__main__':app.run_server()
图4
而除了常见的html
元素之外,Dash
还在其官方依赖库dash_core_components
中内置了众多常见网页小部件,是我们实现交互式所依托的重要元素,就像下面的例子一样我们利用其Dropdown
部件创建出一个下拉选择部件:
❝
app3.py
❞
import dash
import dash_html_components as html
import dash_core_components as dccapp = dash.Dash(__name__)app.layout = html.Div([html.H1('下拉选择'),html.Br(),dcc.Dropdown(options=[{'label': '选项一', 'value': 1},{'label': '选项二', 'value': 2},{'label': '选项三', 'value': 3}])]
)if __name__ == '__main__':app.run_server()
图5
Dash
与plotly
既然“师出同门”,自然已经相互打通,我们同样可以非常轻松的在网页中插入数据可视化的内容,这里我们使用到plotly.express
,它简化了诸多plotly
图表的创建过程,将创建好的图表对象作为figure
参数传入dcc.Graph()
中即可:
❝
app4.py
❞
import dash
import dash_html_components as html
import dash_core_components as dcc
import plotly.express as pxapp = dash.Dash(__name__)fig = px.scatter(x=range(10), y=range(10))app.layout = html.Div([html.H1('嵌入plotly图表'),dcc.Graph(figure=fig)]
)if __name__ == '__main__':app.run_server()
图6
除了上述的几个官方Dash
依赖库以外,还有很多优秀的第三方库都可以帮助我们快速创建出效果惊人的前端内容,关于这部分的详细内容我将会在本系列之后的文章中分主题详细介绍,敬请期待。
2.2 用callback实现交互
Dash
最大的优点之一就是其高度封装了React.js
,使得我们无需编写js
代码即可实现前端与后端之间的异步交互,为了实现这一步,我们需要使用到dash.dependencies
中的Input
与Output
,再配合自定义回调函数来实现所需交互功能。
举一个非常简单的例子:我们设计一个web页面,其中有一个「下拉选项」部件,当我们下拉选取到某个选项值对应的省份时,其下方打印出对应的省会城市:
❝
app5.py
❞
import dash
import dash_html_components as html
import dash_core_components as dcc
from dash.dependencies import Input, Outputapp = dash.Dash(__name__)app.layout = html.Div([html.H1('根据省名查询省会城市:'),html.Br(),dcc.Dropdown(id='province',options=[{'label': '四川省', 'value': '四川省'},{'label': '陕西省', 'value': '陕西省'},{'label': '广东省', 'value': '广东省'}],value='四川省'),html.P(id='city')]
)province2city_dict = {'四川省': '成都市','陕西省': '西安市','广东省': '广州市'
}@app.callback(Output('city', 'children'),Input('province', 'value'))
def province2city(province):return province2city_dict[province]if __name__ == '__main__':app.run_server()
图7
在交互操作的时候查看后台可以看到,每一次点选都在进行与后台的「异步通信」,我们整个应用的页面并没有刷新,如果不用Dash
,你就得书写相应的js
语句,较为繁琐:
图8
而Dash
目前已经支持「多输入多输出」的回调函数书写方式,以及「阻止初次回调」、「基于表单提交状态的回调」等诸多特性,理论上你可以创建出任何形式的页面交互行为,这些内容我们都会在之后的系列文章中详细教授给大家。
2.3 监听图表交互式选择行为
Dash
与plotly
的高度耦合,还体现在其可以监听针对plotly
图表的悬浮、选择、框选等行为,广泛适用于plotly
中的大量常规图表与地图,这一点懂的朋友应该都明白,借助这个特性,我们可以创建出交互能力强大的web应用,就像我下面的这个典型的例子:
❝
app6.py
❞
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.express as pxapp = dash.Dash(__name__)fig = px.scatter(x=range(10), y=range(10), height=400)
fig.update_layout(clickmode='event+select') # 设置点击模式app.layout = html.Div([dcc.Graph(figure=fig, id='scatter'),html.Hr(),html.Div(['悬浮事件:',html.P(id='hover')]),html.Hr(),html.Div(['点击事件:',html.P(id='click')]),html.Hr(),html.Div(['选择事件:',html.P(id='select')]),html.Hr(),html.Div(['框选事件:',html.P(id='zoom')])]
)# 多对多的回调函数
@app.callback([Output('hover', 'children'),Output('click', 'children'),Output('select', 'children'),Output('zoom', 'children'),],[Input('scatter', 'hoverData'),Input('scatter', 'clickData'),Input('scatter', 'selectedData'),Input('scatter', 'relayoutData')])
def listen_to_hover(hoverData, clickData, selectedData, relayoutData):return str(hoverData), str(clickData), str(selectedData), str(relayoutData)if __name__ == '__main__':app.run_server()
可以看到,我们监听到的悬浮、点击、选择以及框选四种行为对应传回的特征数据:
图9
而这方面内容,我也会在之后的系列文章中进行非常详实的介绍????~
我们接下来的系列文章就会围绕上述基础概念,以及「多页面应用」、「外部css、js的引入」、「Dash应用的部署发布」等还未提及的重要内容进行详细介绍,以帮助广大使用Python
的读者朋友使用最少的前端知识,创建出优秀的web应用,方便日常的工作学习生产生活,敬请期待!
以上就是本文的全部内容,欢迎在评论区与我进行讨论~
更多精彩推荐
2020 ACM Fellows 名单出炉,13 名华人入选,7 名来自国内!
舌尖上的AI:人工智能技术正在被“端上”餐桌
腾讯AI足球队夺冠Kaggle竞赛,绝悟强化学习方案迁移至足球队
用Matplotlib轻松复刻分析图,看看哪个城市买房最自由
精彩碰撞!神经网络和传统滤波竟有这火花?
相关文章:

POJ 1273 Drainage Ditches
网络流。题意非常easy。给出单向边,容量。找最大流。注意重边要加起来。g[u][v].cc; 第一次写网络流。也是第一个网络流的题。看了两天,理解了之后就唰唰唰的写出来了。 大概可能是EK吧。ORZ都不知道用的啥算法。仅仅是感觉要这样写。由于重边还WA了。改…

利用GridView显示主细表并一次编辑明细表所有数据的例子
全部代码如下: ASPX: <% Page Language"C#"ValidateRequest"false"AutoEventWireup"true"EnableViewState"false"CodeFile"Default2.aspx.cs"Inherits"Default2"%><!DOCTYPE ht…
TensorFlow搭建垃圾分类系统大师(免费领源码)
人工智能是一个多学科交叉融合的领域,其包含机器学习、计算机视觉、自然语言处理等多个子领域,其中计算机视觉是应用最广泛的领域之一。大多数人熟悉的手机和相机中的人脸识别功能,就是人工智能子领域——计算机视觉的体现。计算机视觉中的图…

for的循环遍体
以下讲解for的变体形式,对于一般的for语句常规这里不再赘述关于for变体 主要是用来实现一些特殊需求://注意不要使for成为死循环 for(int i0;i!5;1){//DOLOOP }1)假如,我们需要对循环变量i在循环外部使用,并调用循环变…

切版网上线,启用qieban.cn
2019独角兽企业重金招聘Python工程师标准>>> 近期,切版网收购并启用了qieban.cn域名,输入域名可以看到非常抢眼的黄底黑色的网站。复制国外psd2html模式,主要提供html5/css3前端外包。 可见切版网对域名的保护是非常的重视。据查询…

Microsoft .NET Pet Shop 4 架构与技术分析
1.项目概述与架构分析微软刚推出了基于ASP.NET 2.0下的Pet Shop 4, 该版本有了一个全新的用户界面。是研究ASP.NET 2.0的好范例啊,大家都知道,一直以来,在.NET和Java之间争论不休,到底使用哪个平台开发的企业级应用性能…
一学就会的 Python 时间转化总结(超全)
作者 | Peter来源 | Python编程时光在生活和工作中,我们每个人每天都在和时间打交道:早上什么时候起床?地铁几分钟来一趟?中午什么时候开始午休?明天是星期几?距离上次买衣服已经2个月呢?领导让…

ny20 吝啬的国度
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB难度:3描述在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果…

Linux常见命令(二)
随着Linux应用的扩展许多同学开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起。虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命令行,无…
谷歌编程语言年度榜NO.1:知识体系总结(2021版)
本文专注整理一些有关Python学习的知识体系。整理的Python知识体系主要包括基础知识,Python热门的应用方向,推荐书籍,FAQ以及一些常见面试题目,包含了作为一个Python全栈工程师以及数据分析工程师在开发工作和学习中需要用到或者可…

看看大网站到底是如何保障网络安全的
首先,服务器上用的是私有的操作系统和数据库,所谓私有,并不是完全自己写,而是说,全部都是进行私有化改造过的,一般使用开源的操作系统和数据库进行改造,比如说操作系统使用free bsd的改…

php 魔术方法 说明
1、__get、__set这两个方法是为在类和他们的父类中没有声明的属性而设计的。◆__get( $property ) 当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名。◆__set( $property, $value ) 给一个未定义的属性赋值时,此方法会被…

小功能 - 收藏集 - 掘金
中国可以访问 Google Codelabs 网站啦! - 掘金今天,Google 官方又宣布了一条信息「全球皆可访问的 Google Codelabs 网站」,说是全球,其实我们大家心里都明白,这是针对中国开发者而专门发布的一个网站,最近…

ASP.NET设置数据格式与String.Format使用总结
{0:d} YY-MM-DD{0:p} 百分比00.00%{0:N2} 12.68{0:N0} 13{0:c2} $12.68{0:d} 3/23/2003{0:T} 12:00:00 AM{0:男;;女} DataGrid-数据格式设置表达式 数据格式设置表达式 .NET Framework 格式设置表达式,它在数据显示在列中之前先应用于数据。此表达式由可选静态文本…

Android Display System --- Surface Flinger
SurfaceFlinger 是Android multimedia 的一个部分,在Android 的实现中它是一个service ,提供系统范围内的surface composer 功能,它能够将各种[url]应用[/url]程序的2D 、3D surface 进行组合。在具体讲SurfaceFlinger 之前,我们先…
最新组合式模型量化方法,实现FPGA最高硬件利用率,准确率-推理速度达到SOTA...
作者 | 王言治来源 | AI科技大本营(ID:rgznai100)深度神经网络(DNN)在图像、语言处理等领域获得了巨大成功,而如何将这些网络部署在ASIC、FPGA等嵌入式设备仍是热门研究方向。结构搜索,以及传统的剪枝、量化…

消息服务发送短信,手机接收不到短信解决思路
阿里云使用消息服务,发送注册码给手机。测试几次发现手机都接收不到,后台也没报错!今天我提交自己的工单,售后工程师已经帮我解决了,非常感谢他!官方代码:https://help.aliyun.com/document_det…

Asp.net中具体的日期格式化用法
1.绑定时格式化日期方法: <ASP:BOUNDCOLUMN DATAFIELD "JoinTime " DATAFORMATSTRING "{0:yyyy-MM-dd} " > <ITEMSTYLE WIDTH "18% " > </ITEMSTYLE > </ASP:BOUNDCOLUMN > 2.数据控件如DataGrid/DataList等的件格式…
日本「AI 鱼脸识别」项目,每分钟识别 100 条
来源 | HyperAI超神经头图 | 视觉中国近日,日本的一个 AI 分拣鱼类项目进入实验阶段。这将有望改善日本渔业劳动力老龄化及短缺的社会现状。日本作为岛国,其独特的地理位置,让国民自古以来就跟鱼结下了不解之缘,甚至形成了其独特的…

使用Spring实现邮件发送
2019独角兽企业重金招聘Python工程师标准>>> 这两天写个小程序需要使用邮件发送的功能,在网上搜索了一帮子文章,感觉还是使用Spring的邮件发送功能比较方便,哈哈,懒人就这样子了,不想再动了。整好了&#x…

GZip压缩与解压缩
GZIP的压缩与解压缩代码: public static class CompressionHelper{/// <summary> /// Compress the byte[] /// </summary> /// <param name"input"></param> /// <returns></returns> public static byte[] Compres…

String.Format()方法
String.Format方法是我们在.Net应用开发时经常使用到的,它的灵活使用有时能够达到事半功倍的效果,下面我们就借用MSDN上的一个示例来向大家展示String.Format的各种用法。 该示例展示了Numeric、DateTime和Enumeration标准格式的使用,另外&am…

Brian 的 Perl 问题之万能指南
为什么80%的码农都做不了架构师?>>> PerlChina brians Guide to Solving Any Perl Problem Home Page | All Pages | Recently Revised | Authors | Feeds | Export | 原 名:Brian’s Guide to Solving Any Perl Problem 中 文: Brian 的 Pe…

联手小米,雀巢中国推出健康管家Nesfinity,满足个性化生活需求管理
1月20日,雀巢中国携手小米战略合作正式开启,双方共同打造的雀巢健康管家“Nesfinity”正式发布。这项综合性智能健康生活新生态的合作,不仅开启了雀巢中国在智能物联网和大数据应用的新历程,更是双方由品牌合作跨入战略合作的开端…

使用joda-time工具类 计算时间相差多少 天,小时,分钟,秒
下面程序使用了两种方法计算两个时间相差 天,小时,分钟,秒 package jodotest;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;import org.joda.time.DateTime;import org.joda.time.Days;import …

C语言格式控制符和转义字符
1. 格式控制符 格式输出printf 作用是向终端输出若干个类型任意的数据。 格式:printf (格式控制符,输出列表) 1) 格式控制符 l % 格式说明引导符。 l - 指定…

面试高频题:单链表的逆置操作/链表逆序
函数内对形参的操作并不能影响实参,函数内修改的是实参的副本。要想在函数内部修改输入参数,要么传入的是实参的引用,要么传入的是实参的地址。 #include <iostream> #include <cstdlib> #include <cstring>//strlen using…
猖狂!微软、思科源码惨遭黑客 100 万美元打包出售
【编者按】SolarWinds 黑客攻击事件又延伸出新的危害了:微软、思科、FireEye 等公司的源代码在一网站公开出售,明码标价,甚至打包价为一百万,究竟是什么情况?整理 | 郑丽媛出品 | CSDN(ID:CSDNn…

vmstart的用法
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是…

配置.net 3.0开发环境
开发.net 3.0 应用程序,需要配置开发环境。配置步骤如下:1. 开发.net 3.0,首先当然要安装.NET Framework 3.0 了安装前使用windowsupdate安装好最新的更新(Windows XP SP2 和Windows 2003 SP1一定要安装),下…