Skip to content

基本用法

Eric Du edited this page Mar 18, 2014 · 24 revisions

使用Veil框架需要两部分代码。一部分是Veil框架本身,这个直接使用git clone出来的Veil代码库就可以了。第二部分是应用程序部分,这部分代码使用Veil框架,共同结合成一个完整可运行的程序。所以基本的使用步骤是:

获得Veil框架本身

假设放置Veil框架的目录是~/Projects/veil

git clone [email protected]:honovation/veil.git ~/Projects/veil

创建空的应用程序

假设放置应用程序的目录是~/Projects/demo

cd ~/Projects/demo
~/Projects/veil/bin/veil init

这样会创建一个空的应用程序,并且这个应用程序通过veil.pth文件把之前clone的veil框架包含到自身的virtualenv来了。veil.pth的内容如下,仅供参考:

cat env/lib/python2.7/site-packages/veil.pth 
/home/dejavu/Projects/veil/src
/home/dejavu/Projects/demo/src

编写配置应用程序的组件

我们注意到新创建的应用程序有一个src/veil.py文件。这个文件就是沟通Veil框架和应用程序的桥梁。Veil框架通过__veil__.py知道应用程序有哪些组件,以及如何安装。最基本的__veil__.py文件要包含一个名字叫COMPONENTS,类型为list的变量。比如 以下使用VEIL_HOME指代~/Projects/demo目录,也就是应用程序所在的目录

通过初始化COMPONENTS变量,我们引入了一个python的package名字叫demo。这个package的实现如下:

$VEIL_HOME/src/demo/__init__.py

import veil_component

with veil_component.init_component(__name__):
    pass

veil中有两种package,一种package的实现空的,只起namespace的作用。另外一种package都有如上的init_component的写法,从概念上来说这样的package在veil中称之为component。后面我们可以看到component的具体含义,在这里它只是一种必要的声明组件的写法而已。

$VEIL_HOME/src/demo/demo.py

from veil.frontend.cli import *

@script('hello')
def say_hello():
    print('hello!')

demo.py是组件的具体内容,其作用是给所在组件添加了一个名字叫hello的命令脚本。这样我们就完成了一个最简单的应用程序。

运行

cd $VEIL_HOME
veil demo hello
hello!

veil命令是在执行veil-init的时候添加到/usr/bin下的,其实执行的是~/Projects/veil/bin/veil这个文件。veil这个命令是所有功能执行的入口点,比如说重建数据库,启动web服务器啥的都是用这个命令。只是不同的命令被分属于不同的namespace下,比如veil demo hello中间的demo就是一个namespace。其他的比如veil backend database postgresql server reset <db_name>,这个命令中的“backend database postgresql server“都是namespace,而最后的reset才是命令。这些namespace是从哪里来的呢,其实就是component。因为hello命令定义在名字叫demo的组件内,所以就是veil demo hello。而reset命令定义在veil.backend.database.postgresql.server这个component内,所以就有这么一长串的namespace作为与其他命令的区隔。

创建网站

Veil做为一个Web开发框架,当然不能只支持@script命令行脚本。下面就是一个完整的网站例子:

__veil__.py

import importlib

COMPONENTS = [
    importlib.import_module('demo')
]

from veil.backend.shell import *

PROGRAM_INSTALLERS = {
    'demo_website': lambda: shell_execute('veil demo install')
}

__veil__.py中包括两部分内容。COMPONENTS定义的是整个应用程序的逻辑视图。下面的PROGRAM_INSTALLERS定义的是整体的物理视图,也就是部署视图。完整的__veil__.py由四部分组成:

  • COMPONENTS:定义了要初始化的应用程序组件
  • ARCHITECTURE:定义了内部组件之间的互相以来关系
  • PROGRAM_INSTALLER:定义了整个应用程序由哪些进程(PROGRAM)组成,以及每个进程的安装程序
  • ENVIRONMENTS:定义了进程如何分布到不同环境的不同服务器上,比如有的服务器只运行数据库,就不许要安装WEB服务器

demo/__init__.py

import veil.component

with veil.component.init_component(__name__):
    def init():
        from veil.environment.setting import add_settings
        from veil.profile.web import website_settings

        add_settings(website_settings('demo', 8080))

demo组件的初始化就是给名字叫demo的网站设置端口为8080。这样我们在浏览器中输入http://localhost:8080就可以访问到我们写的网站了。settings是Veil的一个全局设置,其构成是一个树状的字典。如果我们把add_settings之后的settings打印出来的话就是这样的:

{u'supervisor': {u'programs': {u'demo_website': {u'command': u'veil frontend web launcher up demo'}}},
 u'veil': {u'demo_website': {u'domain': u'demo.dev.dmright.com',
                             u'external_static_files_directory': path('/home/dejavu/Projects/demo/static'),
                             u'host': u'localhost',
                             u'inline_static_files_directory': path('/home/dejavu/Projects/demo/var/development/inline-static-files'),
                             u'port': 8080}}}

可以看到website_settings('demo', 8080)做了两件事情。一个是定义了一个名字叫demo_website的program,这个program知道如何让自己启动起来,也就是veil frontend web launcher up demo。第二件事情是定义了一个demo_website,其中有一个port参数是8080。

demo/demo.py

from __future__ import unicode_literals, print_function, division
from veil.profile.web import *

@route('GET', '/hello')
def say_hello():
    return 'hello!'

demo.py文件定义了一个/hello路由。这个路由使得我们访问http://localhost:8080/hello的时候可以看到一个`hello!`的页面。

demo/demo_installer.py

from __future__ import unicode_literals, print_function, division
from veil.environment.installation import *

@installation_script()
def install_demo_website():
    pass

在前面的__veil__.py中,我们定义了demo_website是如何被安装的,veil demo install。这就要求我们实现这个命令行脚本。目前demo网站并没有额外的安装过程要做,所以用默认的@installation_script就可以了。

安装并运行网站

前面运行@script版的veil demo hello时候,我们并不需要安装第三方的依赖。但是要把一个网站运行起来就没有那么简单了,起码要把网站使用的tornado服务器安装了。安装方式如下:

cd $VEIL_HOME
sudo veil install --upgrade-mode=latest

然后veil框架就会根据我们在__veil__.py中配置的PROGRAM_INSTALLERS把整个应用程序安装好。

cd $VEIL_HOME
sudo veil up

veil up的时候会把前面website_settings定义的program启动起来。然后我们访问http://localhost:8080/hello就可以看到结果了。