Dock框架学习

作者: 11月的射手座 | 来源:发表于2018-01-11 14:31 被阅读130次

    DOCK 框架学习

    1. download and install
    2. 简单使用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'
    

    相关文章

      网友评论

        本文标题:Dock框架学习

        本文链接:https://www.haomeiwen.com/subject/znoznxtx.html