Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18758
  • 博文数量: 4
  • 博客积分: 170
  • 博客等级: 入伍新兵
  • 技术积分: 52
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-28 09:25
个人简介

帝都码农

文章分类

全部博文(4)

文章存档

2013年(1)

2012年(3)

我的朋友

分类: 云计算

2012-12-12 20:46:02

Keystone是利用paste模块对外提供HTTP协议的WSGI服务。


我们要想添加新的接口,可以直接在keystone/service.py文件的对应类方法中添加路由规则,如要在普通用户接口添加用户能修改自己的密码 ,可以在PublicRouter的初始化函数中添加,代码如下:


点击(此处)折叠或打开

  1. def __init__(self):
  2.     mapper = routes.Mapper()
  3.  
  4.     version_controller = VersionController('public')
  5.     mapper.connect('/',
  6.                    controller=version_controller,
  7.                    action='get_version')
  8.     #这下面是新添加的内容,还要定义ModifyController类和它的modify_password方法
  9.     modify_controller = ModifyController()
  10.     mapper.connect('/modify_password',
  11.                     controller=modify_controller,
  12.                    action='modify_password')
  13.     #添加部分结束


通过上面的代码添加了新的HTTP接口,意思是在请求/modifypassword路径时,会调用modifycontroller.modifypassword方法来处理,未定义请求方法,所以POST,GET,HEAD,DELETE等方法都可以, 然后再定义ModifyController类,并实现它的modifypassword方法,像下面这个样子,这里只是给出一个很简单的例子,没有逻辑部分,如果真的要修改用户的密码,还要做很多判断,是不是用户,原来密码对不对等判断,然后修改用户的密码更新数据库中记录:

点击(此处)折叠或打开

  1. class ModifyController(wsgi.Application):
  2.     def modify_password(self, context, auth=None):
  3.         #modify user's password
  4.         #判断用户信息是否正确,token或是帐号密码,然后更新数据库记录
  5.         return {"info": "succeed"}

重启keystone服务后,就可以访问我们刚加的接口了,因为上面接口没有添加任何判断,只是返回字典的json串,所以任何都能访问

点击(此处)折叠或打开

  1. #发送POST请求,要求返回格式是json串
  2. curl -X POST {uri}:5000/v2.0/modify_password -H Accept:application/json
  3. #下面是返回信息
  4. {"info": "succeed"}


因为Keystone用了paste模块,还可以修改配置文件来添加,例如要在普通用户接口添加用户修改自己密码功能,先来修改keystone.conf文件,默认在/etc/keystone/keystone.conf 在

点击(此处)折叠或打开

  1. # 这里是新添加的扩展
  2. [filter:modify_password_extension]
  3. paste.filter_factory = keystone.contrib.modify_password:CrudExtension.factory
  4.  
  5. # 把上面添加的filter加到下面public_api中
  6. [pipeline:public_api]
  7. pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension user_crud_extension modify_password_extension public_service
  8.  
  9. [composite:main]
  10. use = egg:Paste#urlmap
  11. /v2.0 = public_api
  12. / = public_version_api

pipeline就像是python中的装饰器,最后一个定义的函数(应用),前面都是装饰器(对应用的封装,最后返回一个封装后的应用,可以向应用中添加新的route) 我们添加了一个过滤器,调用keystone.contrib.modify_password.CrudExtension.factory方法对应用再进行一次封装 这里只是一个示范,所以会用最简单的方法,不做处理,要实现什么功能在方法里添加就行了


点击(此处)折叠或打开

  1. #引入模块
  2. from keystone.common import wsgi
  3.  
  4. #创建新的应该,添加到原来应用当中成为扩展
  5. class Controller(wsgi.Application):
  6.     def set_user_password(self, context):
  7.         return {'info': "modify password"}
  8.  
  9. #扩展Route,会添加新的路由规则到路由表中
  10. class CrudExtension(wsgi.ExtensionRouter):
  11.     def add_routes(self, mapper):
  12.         user_controller = Controller()
  13.         mapper.connect('/modify_password',
  14.                        controller=user_controller,
  15.                        action='set_user_password',
  16.                        )

这样在有请求到'/modifypassword'的路径时,就调用UserController.setuser_password方法来处理。

第二种添加扩展方式可以和第一种添加方式同时使用,如果同时使用的路径也是一样的(即按上面的添加方式,都添加/modify_password'),会调用第二种添加的方法来处理,因为这个和python中的函数装饰一样,装饰器的会先调用,如果装饰器直接返回结果,就不会调用被封装的函数了。

阅读(1341) | 评论(1) | 转发(0) |
0

上一篇:python singleton

下一篇:paste.deploy学习笔记

给主人留下些什么吧!~~