Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

caravel系列之架构与源码浅析

$
0
0

caravel系列之架构与源码浅析

如果你打算改造和定制caravel,这篇文章可能对你有帮助

外围观察

上边的这张图列出了caravel用到的部分技术(由Wappalyzer分析得出)

包括:

后端

采用python的Flask框架(当前版本是Flask 0.11.10,caravel版本是0.10.0)

前端 React Bootstrap D3 NVD3 jQuery

技术栈的细节可以通过翻阅 源码库 得到

走近源码库
caravel系列之架构与源码浅析

查阅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中一试,完全可用:


caravel系列之架构与源码浅析
后记

目前这个分析更侧重项目结构的源码分析,还不涉及数据分析部分的分析,限于时间有限,数据部分,下回分解


Viewing all articles
Browse latest Browse all 9596

Trending Articles