我们的应用定名为 pySvnManager。建立同名的 Pylons 框架:
$ paster create -t pylons pySvnManager Selected and implied templates: Pylons#pylons Pylons application template Variables: egg: pySvnManager package: pysvnmanager project: pySvnManager Enter template_engine (mako/genshi/jinja/etc: Template language) ['mako']: Enter sqlalchemy (True/False: Include SQLAlchemy 0.4 configuration) [False]: Creating template pylons Creating directory ./pySvnManager … $ cd pySvnManager $ ls -F development.ini ez_setup.py pysvnmanager/ README.txt setup.py docs/ MANIFEST.in pySvnManager.egg-info/ setup.cfg test.ini
启动Web应用:
$ paster serve --reload development.ini
Starting subprocess with file monitor
Starting server in PID 817.
serving on http://127.0.0.1:5000
用浏览器访问 http://127.0.0.1:5000 会看到一个网页。这个网页实际上调用的是
public/index.html 文件。如果删除该文件,则浏览器显示
404错误(网页未找到)。
下面用命令创建控制器 check,会产生两个文件,一个是控制器文件本身:
controllers/check.py,另外一个是单元测试文件:
tests/functional/test_check.py。
$ paster controller check
Creating /home/jiangxin/pyenv/pySvnManager/pysvnmanager/controllers/check.py
Creating /home/jiangxin/pyenv/pySvnManager/pysvnmanager/tests/functional/test_check.py
用浏览器访问URL:http://127.0.0.1:5000/check/ 会看到Hello World。
我们追根溯源,会看到 controllers/check.py 中的代码:
class CheckController(BaseController):
def index(self):
return 'Hello World'
哦,原来如此。Pylons 已经将 URL到代码的映射搞定!就是将浏览器对 URL 的访问映射到控制器代码,再由控制器处理后将结果显示给浏览器。 控制器调用实现逻辑(即Model),然后把从Model获取的结果填充到模板(View)中, 于是 MVC 便实现了逻辑和展现分离。Pylons 框架实现的将URL映射到控制器代码, 和 Windows 下 VC/Delphi 等GUI编程中将事件(鼠标、按钮等)映射到对应的代码是多么的近似。
还记得我们已经删除了 public/index.html 文件么?
我们现在通过修改控制器映射,将 Web 应用的缺省首页指向我们新建立的 controller。
要修改的文件就是: config/routing.py
18 map.connect('/error/{action}', controller='error')
19 map.connect('/error/{action}/{id}', controller='error')
20
21 # CUSTOM ROUTES HERE
22 map.connect('/', controller='check', action='index')
23
24 map.connect('/{controller}')
25 map.connect('/{controller}/{action}')
26 map.connect('/{controller}/{action}/{id}')
第22行是我们新增的,告诉Pylons,将缺省的主页定位到名为 check 的控制器的
index 方法(动作)。
我们打开浏览器访问 http://127.0.0.1:5000/ 会自动定位到
http://127.0.0.1:5000/check/index 。
把我们已经开发完毕的 svnauthz 模组及其单元测试放到
pySvnManager 的代码树中,因为 svnauthz
和 pySvnManager 的耦合很紧,没有必要单独维护
svnauthz 模组。
pySvnManager/model 目录是放置模组的地方,
将 svnauthz 的模组放在该目录下。
至于单元测试用例,则应该拷贝到 pysvnmanager/tests
目录下。该目录下有文件 test_models.py,就是用于测试模组的。
我们可以用 test_svnauthz.py 覆盖
空文件 test_models.py ,并在该文件中设置 Python 包含路径,
以便能成功包含要测试的模组:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- … 20 import os 21 import sys 22 sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) 23 24 from pysvnmanager.tests import * 25 from pysvnmanager import model 26 from pysvnmanager.model.svnauthz import *
实验一下 nosetests 是否依然可靠运行。
$ nosetests
.............
----------------------------------------------------------------------
Ran 13 tests in 0.546s
OK
Copyright © 2006 WorldHello 开放文档之源 计划 |