

caravel系列之架构与源码浅析
source link: http://wwj718.github.io/post/%E6%95%B0%E6%8D%AE/caravel-code/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如果你打算改造和定制caravel,这篇文章可能对你有帮助
上边的这张图列出了caravel用到的部分技术(由Wappalyzer分析得出)
采用python的Flask框架(当前版本是Flask 0.11.10,caravel版本是0.10.0)
- React
- Bootstrap
- jQuery
技术栈的细节可以通过翻阅源码库得到
走近源码库
查阅caravel的项目页我们可以知道其技术栈构成,python和javascript分别支撑前后端,python占据大半代码量
查阅源码库中的setup.py,我们可以知道项目依赖
- ‘cryptography==1.4’,
- ‘flask-appbuilder==1.8.1’,
- ‘flask-cache==0.13.1’,
- ‘flask-migrate==1.5.1’,
- ‘flask-script==2.0.5’,
- ‘flask-testing==0.5.0’,
- ‘flask-sqlalchemy==2.0’,
- ‘humanize==0.5.1’,
- ‘gunicorn==19.6.0’,
- ‘markdown==2.6.6’,
- ‘pandas==0.18.1’,
- ‘parsedatetime==2.0.0’,
- ‘pydruid==0.3.0’,
- ‘python-dateutil==2.5.3’,
- ‘requests==2.10.0’,
- ‘simplejson==3.8.2’,
- ‘six==1.10.0’,
- ‘sqlalchemy==1.0.13’,
- ‘sqlalchemy-utils==0.32.7’,
- ‘sqlparse==0.1.19’,
- ‘werkzeug==0.11.10’,
我们忽视工具型的库,对核心库做个简要介绍
flask-appbuilder
Simple and rapid application development framework, built on top of Flask. Includes detailed security, auto CRUD generation for your models, google charts and much more.
flask-appbuilder是caravel的项目骨架,如果想定制深度caravel,建议认真读完flask-appbuilder的文档
更多介绍可以参考flaskappbuilder.pythonanywhere.com/或者Introduction
一些简单的案例可以参考这里examples和Flask-AppBuilder-Skeleton
flask-appbuilder给我感觉像是把flask的工具链做了整合,使其功能全面(通往django之路?)
pandas
关于pandas的介绍我们引这篇文章:
Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型
sqlalchemy
SQLAlchemy是Python社区中最广泛使用的ORM工具,底层而强大
SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行
关于sqlalchemy的更多细节,可以参考我的这篇文章
- “autobind-decorator”: “^1.3.3”,
- “babel-loader”: “^6.2.1”,
- “babel-polyfill”: “^6.3.14”,
- “babel-preset-es2015”: “^6.3.13”,
- “babel-preset-react”: “^6.3.13”,
- “bootstrap”: “^3.3.6”,
- “bootstrap-datepicker”: “^1.6.0”,
- “bootstrap-toggle”: “^2.2.1”,
- “brace”: “^0.7.0”,
- “brfs”: “^1.4.3”,
- “cal-heatmap”: “3.5.4”,
- “css-loader”: “^0.23.1”,
- “d3”: “^3.5.14”,
- “d3-cloud”: “^1.2.1”,
- “d3-sankey”: “^0.2.1”,
- “d3-tip”: “^0.6.7”,
- “datamaps”: “^0.4.4”,
- “datatables-bootstrap3-plugin”: “^0.4.0”,
- “datatables.net-bs”: “^1.10.11”,
- “exports-loader”: “^0.6.3”,
- “font-awesome”: “^4.5.0”,
- “gridster”: “^0.5.6”,
- “imports-loader”: “^0.6.5”,
- “jquery”: “^2.2.1”,
- “jquery-ui”: “^1.10.5”,
- “json-loader”: “^0.5.4”,
- “less”: “^2.6.1”,
- “less-loader”: “^2.2.2”,
- “mapbox-gl”: “^0.20.0”,
- “mustache”: “^2.2.1”,
- “nvd3”: “1.8.3”,
- “react”: “^0.14.7”,
- “react-bootstrap”: “^0.28.3”,
- “react-dom”: “^0.14.7”,
- “react-grid-layout”: “^0.12.3”,
- “react-map-gl”: “^1.0.0-beta-10”,
- “react-resizable”: “^1.3.3”,
- “select2”: “3.5”,
- “select2-bootstrap-css”: “^1.4.6”,
- “style-loader”: “^0.13.0”,
- “supercluster”: “Pending PR at https://github.com/mapbox/supercluster/pull/12",
- “supercluster”: “https://github.com/georgeke/supercluster/tarball/ac3492737e7ce98e07af679623aad452373bbc40",
- “topojson”: “^1.6.22”,
- “transform-loader”: “^0.2.3”,
- “viewport-mercator-project”: “^2.1.0”,
- “webpack”: “^1.12.12”,
- “webworkify-webpack”: “1.0.6”
源码分析(后端)
caravel提供命令行工具caravel
,项目的创建,demo的加载都由改指令负责,例如:
# Create default roles and permissions
caravel init
# Load some data to play with
caravel load_examples
# Start the web server on port 8088
caravel runserver -p 8088
我们知道setup.py里的scripts将被注册为命令行工具(参考 Installing Scripts),caravel
便是注册自这里
从源码中我们看到scripts=['caravel/bin/caravel']
,按图索骥找到入口:caravel
从中我们连接到caravel(caravel runserver)服务跑起来时各个参数的意义
- -d : 以debug模式启动 //官方教程里启动caravel服务的指令为 caravel runserver -d ,即默认为调试模式,
- -p : 指定端口
- -w : 指定gunicorn的worker数量 // gunicorn是一个Python WSGI UNIX的HTTP服务器
- -t : 指定gunicorn服务过期时间
当我们用-d参数运行caravel runserver时,我们并未将wsgi app跑在gunicorn,如果是生产使用,应该去掉-d
如果我们有兴趣跟踪或定制caravel init(创建默认角色和权限)和caravel load_example的执行流程,跟踪相应函数即可
web服务
由caravel runserver
跑起来的web服务的相关信息:
- 由gunicorn运行wsgi application
- wsgi application为caravel:app
接下来我们开始分析caravel:app
,这是整个项目的核心所在
caravel:app
由python模块相关的知识(建议参考《learning python》),我们知道from caravel import app
中,当caravel是目录是,app来自caravel/init.py
这实际上是Flask-AppBuilder常见的项目组织形式 ,可以参考这个简要的例子,相关解释看这篇文档
要想了解caravel的项目骨架,必须通读一遍flask-appbuilder的文档
通过阅读flask-appbuilder的文档,我们了解到caravel实际是Flask-AppBuilder的一个具体应用(app),所以我们可以用fabmanager来控制caravel,诸如
# Create an admin user
fabmanager create-admin --app caravel
fabmanager list-users --app caravel
fabmanager list-views --app caravel
caravel api
通过阅读Model Views (Quick How to),我们了解了caravel的项目骨架和model相关的知识,和django十分相似,包括管理CURD机制也和django admin极其相似,django admin的确是个耀眼的设计,被借鉴倒是不奇怪。
这篇文章还提到ModelView最终会暴露出 REST API,而且带有权限验证,方面你做各种粒度的控制 ! 这个设计比django admin还漂亮,惊为天人
相关细节参考Exposed methods
我们到caravel中一试,完全可用:
目前这个分析更侧重项目结构的源码分析,还不涉及数据分析部分的分析,限于时间有限,数据部分,下回分解
Recommend
-
127
本次尝试浅析Node.js中的EventEmitter模块的事件机制,分析在Node.js中实现发布订阅模式的一些细节。完整Node.js源码点这里。 欢迎关注
-
84
Java集合之ConcurrentHashMap源码浅析 2017年11月25日 07:57 · 阅读 2934
-
171
这是《JS 深入浅出》第八课的部分讲义 今天的课的主要内容有 数组的七个 API 的实现 Underscore 源码如何读(函数节流防抖、数组去重都能在源码里看到) join 先从最简单的数组操作开始: var array = ['a','b','c']
-
51
-
50
-
43
今天来讲讲VirtualDom与path之间到底存在什么关系? VNode (VirtualDom) 在未出现双向绑定之前,我们需要在各个触发事件方法中直接操作DOM节点来达到修改相应视图的目的。但是当应用一大就会变得难以维护,reflow(回流)很影响性能的
-
14
【深入浅出jQuery】源码浅析--整体架构 最近一直在研读 jQuery 源码,初看源码一头雾...
-
3
Istio源码解析系列part3—Mixer工作流程浅析 · Service Mesh|服务网格中文社区 本文系转载,作者:郑伟,小米信息部技术架构组 本系列文章主要从源码(
-
6
在上一篇文章里,我们简单介绍了caracel和它的安装方式,这篇文章主要介绍如何简单配置/定制caravel caravel的默认配置为config,我们可能对其中的一些配置...
-
4
caravel是什么 Caravel is an open source data visualization platform that provides easy exploration of your data and allows you to create and share beautiful charts and dashboards carave...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK