Keystone是利用paste模块对外提供HTTP协议的WSGI服务。
我们要想添加新的接口,可以直接在keystone/service.py文件的对应类方法中添加路由规则,如要在普通用户接口添加用户能修改自己的密码
,可以在PublicRouter的初始化函数中添加,代码如下:
- def __init__(self):
- mapper = routes.Mapper()
-
- version_controller = VersionController('public')
- mapper.connect('/',
- controller=version_controller,
- action='get_version')
- #这下面是新添加的内容,还要定义ModifyController类和它的modify_password方法
- modify_controller = ModifyController()
- mapper.connect('/modify_password',
- controller=modify_controller,
- action='modify_password')
- #添加部分结束
通过上面的代码添加了新的HTTP接口,意思是在请求/modifypassword路径时,会调用modifycontroller.modifypassword方法来处理,未定义请求方法,所以POST,GET,HEAD,DELETE等方法都可以,
然后再定义ModifyController类,并实现它的modifypassword方法,像下面这个样子,这里只是给出一个很简单的例子,没有逻辑部分,如果真的要修改用户的密码,还要做很多判断,是不是用户,原来密码对不对等判断,然后修改用户的密码更新数据库中记录:
class ModifyController(wsgi.Application):
def modify_password(self, context, auth=None):
#判断用户信息是否正确,token或是帐号密码,然后更新数据库记录
return {"info": "succeed"}
重启keystone服务后,就可以访问我们刚加的接口了,因为上面接口没有添加任何判断,只是返回字典的json串,所以任何都能访问
- #发送POST请求,要求返回格式是json串
- curl -X POST {uri}:5000/v2.0/modify_password -H Accept:application/json
- #下面是返回信息
- {"info": "succeed"}
因为Keystone用了paste模块,还可以修改配置文件来添加,例如要在普通用户接口添加用户修改自己密码功能,先来修改keystone.conf文件,默认在/etc/keystone/keystone.conf
在
- # 这里是新添加的扩展
- [filter:modify_password_extension]
- paste.filter_factory = keystone.contrib.modify_password:CrudExtension.factory
-
- # 把上面添加的filter加到下面public_api中
- [pipeline:public_api]
- pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension user_crud_extension modify_password_extension public_service
-
- [composite:main]
- use = egg:Paste#urlmap
- /v2.0 = public_api
- / = public_version_api
pipeline就像是python中的装饰器,最后一个定义的函数(应用),前面都是装饰器(对应用的封装,最后返回一个封装后的应用,可以向应用中添加新的route)
我们添加了一个过滤器,调用keystone.contrib.modify_password.CrudExtension.factory方法对应用再进行一次封装
这里只是一个示范,所以会用最简单的方法,不做处理,要实现什么功能在方法里添加就行了
- #引入模块
- from keystone.common import wsgi
-
- #创建新的应该,添加到原来应用当中成为扩展
- class Controller(wsgi.Application):
- def set_user_password(self, context):
- return {'info': "modify password"}
-
- #扩展Route,会添加新的路由规则到路由表中
- class CrudExtension(wsgi.ExtensionRouter):
- def add_routes(self, mapper):
- user_controller = Controller()
- mapper.connect('/modify_password',
- controller=user_controller,
- action='set_user_password',
- )
这样在有请求到'/modifypassword'的路径时,就调用UserController.setuser_password方法来处理。
第二种添加扩展方式可以和第一种添加方式同时使用,如果同时使用的路径也是一样的(即按上面的添加方式,都添加/modify_password'),会调用第二种添加的方法来处理,因为这个和python中的函数装饰一样,装饰器的会先调用,如果装饰器直接返回结果,就不会调用被封装的函数了。
阅读(1341) | 评论(1) | 转发(0) |