DOCK 框架學(xué)習(xí)
- download and install
- 簡(jiǎn)單使用h ello world
- 無(wú)
download & install
從gitlab上下載dock代碼,cd 到setup.py那個(gè)目錄下榔昔,執(zhí)行煞茫,python setup.py develop
note:需要python2 commnad line tools
安裝完成后氓辣,再執(zhí)行pip list 會(huì)看到一個(gè)有Dock 的package
這些操作建議使用虛擬環(huán)境 virtualenv
以上步驟執(zhí)行完就安裝成功了
簡(jiǎn)單使用 hello world
新建一個(gè)文件 first_dock_app.py
#coding:utf-8
import dock
from dock.common import log,statsd,config,run
from dock.web import DockApp
app = DockApp(__name__)
@app.flaskapp.route('/')
def hello():
return 'hello world'
if __name__ == '__main__':
app.run()
寫(xiě)法和flask基本一樣洼滚,因?yàn)檫@個(gè)框架基于flask開(kāi)發(fā)的瞒渠。如何運(yùn)行起來(lái)呢歪脏?需要注意的是疑俭,這個(gè)應(yīng)用需要一個(gè)config.yaml 文件,再當(dāng)前目錄下新建一個(gè)文件config.yaml
婿失,因?yàn)閼?yīng)用啟動(dòng)會(huì)讀取這個(gè)配置文件
再終端輸入 python first_dock_app.py runserver,啟動(dòng)起來(lái)钞艇,默認(rèn)的主機(jī)和端口是0.0.0.0
端口是5000
可以指定主機(jī)和端口,可以寫(xiě)成
python first_dock_app.py runserver --host 127.0.0.1 --port 8090
這個(gè)框架在這命令行用到了docopt
模塊
關(guān)于Dock env
Dock的應(yīng)用會(huì)讀取一個(gè)格式為yaml的配置文件豪硅,當(dāng)創(chuàng)建DockApp或者DockEnv時(shí)哩照,會(huì)自動(dòng)在程序運(yùn)行的當(dāng)前目錄自動(dòng)加載config.yaml文件,如果沒(méi)有config.yaml懒浮,其會(huì)嘗試讀取config.template.yaml文件飘弧,并將其拷貝,重命名為config.yaml砚著,然后讀取次伶。
使用dockenv
from dock.common import dockenv
dockenv('') #初始化,得到config.file 的文件的絕對(duì)路徑稽穆,
在執(zhí)行:
config_object.set_target_object(YamlConfig(self.config_file).preload()) #config_object 是從globals.py 文件導(dǎo)入的
pyYAML
公司的配置文件用的都是yaml文件冠王,學(xué)習(xí)一下這個(gè)模塊
所安裝的模塊是pyYAML
導(dǎo)入
import yaml
關(guān)于yaml文件的格式
它的基本語(yǔ)法規(guī)則如下:
1、大小寫(xiě)敏感
2舌镶、使用縮進(jìn)表示層級(jí)關(guān)系
3柱彻、縮進(jìn)時(shí)不允許使用Tab鍵豪娜,只允許使用空格。
4绒疗、縮進(jìn)的空格數(shù)目不重要侵歇,只要相同層級(jí)的元素左側(cè)對(duì)齊即可
5、# 表示注釋吓蘑,從這個(gè)字符一直到行尾,都會(huì)被解析器忽略坟冲,這個(gè)和python的注釋一樣
1.數(shù)值直接以字面量的形式表示
number:12.30 #{'number':12.3}
2. 布爾值用true和false表示
isSet:true #{'isSet':True}
3.null用~表示
parent:~ # {'parent':None}
4.時(shí)間采用ISO8601格式
time1: 2001-12-14t21:59:43.10-05:00 #{'time1': datetime.datetime(2001, 12, 15, 2, 59, 43, 100000)}
5.日期用iso8601格式的年磨镶、月、日 表示
date: 2017-07-31 #{'date': datetime.date(2017, 7, 31)}
6.YAML 允許使用兩個(gè)感嘆號(hào)健提,強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類型
int_to_str:!!str 123 # {'int_to_str':'123'}
yaml 模塊的使用
使用很簡(jiǎn)單琳猫,兩個(gè)方法,load 和dump
with open(f_path,'r') as f:
c = yaml.load(f)
load()方法返回一個(gè)字典
dump() 方法返回一個(gè)字符串
a = yaml.dump({'name': "The Cloak 'Colluin'", 'depth': 5, 'rarity': 45,
'weight': 10, 'cost': 50000, 'flags': ['INT', 'WIS', 'SPEED', 'STEALTH']})
print(type(a))
關(guān)于dock的積木
Dock積木首先是一個(gè)python module私痹,其必須要包含一個(gè)init函數(shù)脐嫂,接收app作為參數(shù),需要返回多個(gè)Flask 藍(lán)圖對(duì)象紊遵,例如:
def init(app):
from view import foo, bar
#do something
return [foo.blueprint, bar.blueprint]
Dock App提供了mount方法加載Dock積木账千,示例如下:
app.mount(dock_account, mapping={'account': '/<appname>', 'realtime':'/<appname>'})
其中dock_account是積木,mapping是對(duì)account積木的blueprint url路由增加前綴功能的暗膜。
對(duì)于Dock App匀奏,開(kāi)發(fā)時(shí)推薦采用dock-server 來(lái)運(yùn)行,在正式部署時(shí)学搜,可以用gunicorn來(lái)運(yùn)行娃善。
關(guān)于用dock-server 命令行運(yùn)行程序,需要注意的是在在模塊下面要有一個(gè)server.py文件瑞佩,必須是這個(gè)名字聚磺,這個(gè)是寫(xiě)的程序啟動(dòng)的入口(可以這么認(rèn)為)
目錄架構(gòu)如下圖:
├── dock_learn
│ ├── README.md
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── config.yaml
│ ├── hello.py
│ ├── hello.pyc
│ ├── jimu
│ ├── login.py
│ ├── login.pyc
│ ├── server.py
│ └── server.pyc
切換到dock_learn 所在目錄,type:
dock-server dock_learn.server -b 127.0.0.1:8070 -s simple
也可以
dock-server dock_learn
這樣啟動(dòng)的就是IP綁定的是0.0.0.0 端口是5000
在server.py 文件里
#coding:utf-8
from dock.web import DockApp
from jimu import jimu1,jimu2
app = DockApp(__name__)
app.mount(jimu1, mapping={'hello': '/hello', 'realtime': '/<appname>'})
app.mount(jimu2)
這個(gè)文件主要是創(chuàng)建一個(gè)app ,初始化配置炬丸,將積木掛載到app中瘫寝,積木在上文已經(jīng)簡(jiǎn)單的介紹了。
關(guān)于積木有以下幾個(gè)要點(diǎn)
- 必須是一個(gè)模塊
- 模塊里必須有個(gè)init函數(shù)御雕,這個(gè)函數(shù)接受app參數(shù)矢沿,返回一個(gè)或多個(gè)flask 的blueprint 對(duì)象
- 掛載積木
app.mount(jimu1, mapping={'hello': '/hello', 'realtime': '/<appname>'})
mapping接受一個(gè)字典,目的是提供一個(gè)url前綴的功能酸纲,字典的key 對(duì)應(yīng)藍(lán)圖的name
jimu1.py
#coding:utf-8
def init(app):
from dock_learn import hello
return [hello.blueprint]
hello.py
#coding:utf-8
from flask import Blueprint
import time
blueprint = Blueprint('hello', __name__) #initialize a blueprint object
@blueprint.route('/')
def hello():
return 'hello %s'% str(time.time())
@blueprint.route('/home')
def home():
return 'welome to home'