文档章节

caravel之架构与源码浅析

aibati2008
 aibati2008
发布于 2016/10/11 14:31
字数 1914
阅读 212
收藏 4

 

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

外围观察

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

包括:

后端

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

前端

  • React
  • Bootstrap
  • D3
  • NVD3
  • 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

一些简单的案例可以参考这里examplesFlask-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

 

caravel的默认配置为config,我们可能对其中的一些配置项感兴趣

  • CARAVEL_WORKERS
  • CARAVEL_WEBSERVER_PORT
  • APP_NAME
  • APP_ICON
  • BABEL_DEFAULT_LOCALE
  • LANGUAGES
  • CACHE_CONFIG
  • ENABLE_CORS

这些变量的自说明性很好,就不解释了

修改默认配置

创建caravel_config.py,通过在PYTHONPATH里添加caravel_config.py所在目录的路径

至于如何修改PYTHONPATH,我的做法是修改~/.bash_profile,添加

export PYTHONPATH=/home/wwj/caravel_dev

之后需要退出shell,再进入才生效

我的caravel_config.py在/home/wwj/caravel_dev目录下

启动caravel runserver -d,即可看到定制化的caravel

界面定制

点击dashboard里Edit the dashboard'css按钮,之后你可以选择不同的主题,方然也可以添加你自己css样式

caravel使用flask-appbuilder构建项目骨架,flask-appbuilder采用了bootswatch来定制主题样式,可以通过APP_THEME变量来改变主题,可选主题参考bootswatch.com,我偏好slate主题,slate对应的配置为APP_THEME = "slate.css"

具体的配置选项参考:examples/oauth/config.py

更多定制

前头说到caravel使用flask-appbuilder来构建项目骨架,所以flask-appbuilder的配置参数,对caravel有效,具体配置参考:flask-appbuilder config

汉化

首先你需要修改LANGUAGES变量的默认值,默认不包含汉语,当前(2016-07-26)默认安装的caravel版本为caravel-0.10.0,这个版本的源码不带有翻译包(translations), 如果你期望做汉化的话,需要手动将translations/zh/LC_MESSAGES目录放到package安装路径下

以下是我的汉化文件,在目录下执行以下代码即可

wget https://raw.githubusercontent.com/wwj718/caravel/master/caravel/translations/zh/LC_MESSAGES/messages.po
wget https://raw.githubusercontent.com/wwj718/caravel/master/caravel/translations/zh/LC_MESSAGES/messages.mo

 

目前汉化包还不完备,之后有时间,我想维护一个caravel_cn的项目,做些本地化的工作,包括常用前端库的国内cdn和google字体之类的本地化,有兴趣的小伙伴可以一起

认证系统

默认的认证系统为AUTH_TYPE = AUTH_DB,我们可以将其配置为其他选项,诸如:AUTH_REMOTE_USER,AUTH_OID,AUTH_LDAP以及AUTH_OAUTH,配置为OAuth时,需要安装Flask-OAuthlib,之后flask-appbuilder和Flask-OAuthlib有一个整合,如果你需要使用自己的oauth provider,可能需要处理下这部分

另,把用户设置为public,会导致无法登陆(错误信息为:Access is Denied for: can_welcome)。建议给新用户alpha权限,这样一来不具有管理权限,又可以正常浏览

 

 

 

本文转载自:http://blog.just4fun.site/caravel-code.html

共有 人打赏支持
aibati2008
粉丝 13
博文 86
码字总数 61386
作品 0
成都
技术主管
私信 提问
[转载]易上手的数据挖掘、可视化与机器学习工具: Orange介绍

标签 PostgreSQL , Orange3 , 可视化 , 时空数据 背景 可视化分析会是一个让枯燥的数据说话的快捷途径,降低可视化分析门槛,同时又保留它的编程能力,是非常重要的。 如今数据种类越来越多,...

德哥
2018/01/02
0
0
开源OLAP+数据可视化工具–For Apache Kylin

经过我和好友Rocky一段时间的修改和调试,现已将初版的Caravel For Kylin上传至Github,供大家使用,如有发现任何的问题,可通过本博客或github联系我们。 GitHub地址: https://github.com...

openthings
2016/06/13
575
0
caravel的使用问题汇总

1.caravel的配置文件路径 Found solution. Error happends because flaskmanager could not find default db path for sqlite db. To fix this your need to change SQLALCHEMYDATABASE_URI......

aibati2008
2016/06/20
530
0
Java系列文章(全)

JVM JVM系列:类装载器的体系结构 JVM系列:Class文件检验器 JVM系列:安全管理器 JVM系列:策略文件 Java垃圾回收机制 深入剖析Classloader(一)--类的主动使用与被动使用 深入剖析Classloader(二...

www19
2017/07/04
0
0
caravel表的日期字段 进行格式化

@aibati2008 你好,想跟你请教个问题: caravel 在用吗 表的日期字段 进行格式化 在(Add Table Column > Expression) 使用 from_unixtime(mtime, '%Y-%m-%d %H:%i:%S') caravel 怎么会自动加......

lifeinearth
2016/09/09
331
2

没有更多内容

加载失败,请刷新页面

加载更多

数据库技术-Mysql主从复制与数据备份

数据库技术-Mysql 主从复制的原理: MySQL中数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”...

须臾之余
昨天
10
0
Git远程仓库——GitHub的使用(一)

Git远程仓库——GitHub的使用(一) 一 、 Git远程仓库 由于你的本地仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要一下设置: 步骤一、 创建SSH key 在用户主目录下,看看有没有.ss...

lwenhao
昨天
2
0
SpringBoot 整合

springBoot 整合模板引擎 SpringBoot 整合Mybatis SpringBoot 整合redis SpringBoot 整合定时任务 SpringBoot 整合拦截器...

细节探索者
昨天
0
0
第二个JAVA应用

第二个JAVA应用 方法一:配置文件: # cd /usr/local/tomcat/conf/# vim server.xml</Host> <Host name="www.wangzb.cc" appBase="/data/wwwroot/www.wangzb.cc" //引用所......

wzb88
昨天
0
0
2019年阿里Java面试必问:JVM与性能优化+Redis+设计模式+分布式

前言 一年之计在于春 金三银四已经要到来,2019的新的开始,作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是对...

火力全開
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部