caravel之架構與源碼淺析

 

若是你打算改造和定製caravel,這篇文章可能對你有幫助javascript

外圍觀察

上邊的這張圖列出了caravel用到的部分技術(由Wappalyzer分析得出)css

包括:html

後端

採用python的Flask框架(當前版本是Flask 0.11.10,caravel版本是0.10.0)前端

前端

  • React
  • Bootstrap
  • D3
  • NVD3
  • jQuery

技術棧的細節能夠經過翻閱源碼庫獲得java

走近源碼庫

查閱caravel的項目頁咱們能夠知道其技術棧構成,python和javascript分別支撐先後端,python佔據大半代碼量python

後端依賴

查閱源碼庫中的setup.py,咱們能夠知道項目依賴react

  • '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',

咱們忽視工具型的庫,對核心庫作個簡要介紹jquery

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.webpack

flask-appbuilder是caravel的項目骨架,若是想定製深度caravel,建議認真讀完flask-appbuilder的文檔git

更多介紹能夠參考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權限,這樣一來不具備管理權限,又能夠正常瀏覽

相關文章
相關標籤/搜索