-
Notifications
You must be signed in to change notification settings - Fork 3
基本用法
使用Veil框架需要两部分代码。一部分是Veil框架本身,这个直接使用git clone出来的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就可以看到结果了。