Dock框架学习
DOCK 框架学习
- download and install
- 简单使用h ello world
- 无
download & install
从gitlab上下载dock代码,cd 到setup.py那个目录下,执行,python setup.py develop
note:需要python2 commnad line tools
安装完成后,再执行pip list 会看到一个有Dock 的package
这些操作建议使用虚拟环境 virtualenv
以上步骤执行完就安装成功了
简单使用 hello world
新建一个文件 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()
写法和flask基本一样,因为这个框架基于flask开发的。如何运行起来呢?需要注意的是,这个应用需要一个config.yaml 文件,再当前目录下新建一个文件config.yaml
,因为应用启动会读取这个配置文件
再终端输入 python first_dock_app.py runserver,启动起来,默认的主机和端口是0.0.0.0
端口是5000
可以指定主机和端口,可以写成
python first_dock_app.py runserver --host 127.0.0.1 --port 8090
这个框架在这命令行用到了docopt
模块
关于Dock env
Dock的应用会读取一个格式为yaml的配置文件,当创建DockApp或者DockEnv时,会自动在程序运行的当前目录自动加载config.yaml文件,如果没有config.yaml,其会尝试读取config.template.yaml文件,并将其拷贝,重命名为config.yaml,然后读取。
使用dockenv
from dock.common import dockenv
dockenv('') #初始化,得到config.file 的文件的绝对路径,
在执行:
config_object.set_target_object(YamlConfig(self.config_file).preload()) #config_object 是从globals.py 文件导入的
pyYAML
公司的配置文件用的都是yaml文件,学习一下这个模块
所安装的模块是pyYAML
导入
import yaml
关于yaml文件的格式
它的基本语法规则如下:
1、大小写敏感
2、使用缩进表示层级关系
3、缩进时不允许使用Tab键,只允许使用空格。
4、缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
5、# 表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样
1.数值直接以字面量的形式表示
number:12.30 #{'number':12.3}
2. 布尔值用true和false表示
isSet:true #{'isSet':True}
3.null用~表示
parent:~ # {'parent':None}
4.时间采用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 允许使用两个感叹号,强制转换数据类型
int_to_str:!!str 123 # {'int_to_str':'123'}
yaml 模块的使用
使用很简单,两个方法,load 和dump
with open(f_path,'r') as f:
c = yaml.load(f)
load()方法返回一个字典
dump() 方法返回一个字符串
a = yaml.dump({'name': "The Cloak 'Colluin'", 'depth': 5, 'rarity': 45,
'weight': 10, 'cost': 50000, 'flags': ['INT', 'WIS', 'SPEED', 'STEALTH']})
print(type(a))
关于dock的积木
Dock积木首先是一个python module,其必须要包含一个init函数,接收app作为参数,需要返回多个Flask 蓝图对象,例如:
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是对account积木的blueprint url路由增加前缀功能的。
对于Dock App,开发时推荐采用dock-server 来运行,在正式部署时,可以用gunicorn来运行。
关于用dock-server 命令行运行程序,需要注意的是在在模块下面要有一个server.py文件,必须是这个名字,这个是写的程序启动的入口(可以这么认为)
目录架构如下图:
├── 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
这样启动的就是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)
这个文件主要是创建一个app ,初始化配置,将积木挂载到app中,积木在上文已经简单的介绍了。
关于积木有以下几个要点
- 必须是一个模块
- 模块里必须有个init函数,这个函数接受app参数,返回一个或多个flask 的blueprint 对象
- 挂载积木
app.mount(jimu1, mapping={'hello': '/hello', 'realtime': '/<appname>'})
mapping接受一个字典,目的是提供一个url前缀的功能,字典的key 对应蓝图的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'