仿Openstack的WSGI接口及RESTul服务实现(python)(转)

来源:互联网 发布:苹果换彩铃用什么软件 编辑:程序博客网 时间:2024/06/04 23:30
Openstack的WSGI接口通过webob,pastedeploy,routes实现了Controller类,和Router类,这里仿照Openstack的WSG接口实现简单的测试程序首先是testroutes.py文件
import loggingimport osimport webob.dec  import webob.excfrom paste.deploy import loadappfrom wsgiref.simple_server import make_server  import routes.middleware  # Environment variable used to pass the request contextCONTEXT_ENV = 'openstack.context'# Environment variable used to pass the request paramsPARAMS_ENV = 'openstack.params'LOG = logging.getLogger(__name__)class Controller(object):     @webob.dec.wsgify    def __call__(self, req):        arg_dict = req.environ['wsgiorg.routing_args'][1]        action = arg_dict.pop('action')        del arg_dict['controller']        context = req.environ.get(CONTEXT_ENV, {})        context['query_string'] = dict(req.params.iteritems())        context['headers'] = dict(req.headers.iteritems())        context['path'] = req.environ['PATH_INFO']        params = req.environ.get(PARAMS_ENV, {})        for name in ['REMOTE_USER', 'AUTH_TYPE']:            try:                context[name] = req.environ[name]            except KeyError:                try:                    del context[name]                except KeyError:                    pass        params.update(arg_dict)        # TODO(termie): do some basic normalization on methods        method = getattr(self, action)                result = method(context, **params)                return webob.Response('OK')        def getMessage(self,context, user_id):        return {'Message': 'TestMessage'}        pass        class Router(object):      def __init__(self):          self._mapper = routes.Mapper()          self._mapper.connect('/test/{user_id}',                            controller=Controller(),                            action='getMessage',                            conditions={'method': ['GET']})                self._router = routes.middleware.RoutesMiddleware(self._dispatch, self._mapper)         @webob.dec.wsgify      def __call__(self, req):        return self._router        @staticmethod      @webob.dec.wsgify      def _dispatch(req):        match = req.environ['wsgiorg.routing_args'][1]                                if not match:              return webob.exc.HTTPNotFound()                        app = match['controller']        return app        @classmethod    def app_factory(cls, global_config, **local_config):            return cls()        if __name__ == '__main__':    configfile='testroutes.ini'    appname="main"    wsgi_app = loadapp("config:%s" % os.path.abspath(configfile), appname)      httpd = make_server('localhost', 8282, wsgi_app)      httpd.serve_forever()

然后是testroutes.ini文件

[DEFAULT]name=huang[composite:main]use=egg:Paste#urlmap/=show[pipeline:show]pipeline = root[app:root]paste.app_factory = testroutes:Router.app_factory

由此可见,ini文件按照pastedeploy的模式配置了根目录/,指向pipeline show,pipeline又指向app root。app下指向的是Router的app_factory函数,返回的是Router().根据调用过程,初始化__init__->__call__返回self._routers.根据__init__下写的映射规则,能识别类似/test/123这样的路径,其处理函数调用"Controller"的"action"函数,也就是getMessage。

测试运行,在浏览器下输入127.0.0,1:8282/test/123

返回OK,如

return webob.Response('OK')

测试完毕。

bluefire1991

2013.11.2

19:59:12


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 妈妈溜冰溜大了怎么办 皮鞋被雨水泡了怎么办 老婆提出离婚我不想离怎么办 极度缺爱的人怎么办 生二胎住院大宝怎么办 爸妈偏心我该怎么办 无创21体高风险怎么办 无创检查高风险怎么办 唐氏筛查21三体高危怎么办 唐筛年龄高风险怎么办 21三体综合症高风险怎么办 朋友深陷李强365怎么办 飞机上烟瘾犯了怎么办 怀孕一个月吸烟了怎么办 烟瘾犯了没烟怎么办 押金交了不租了怎么办 买车首付款不够怎么办 双11订金不退怎么办 在商场买到假货怎么办 网上买到假手机怎么办 网上买了假手机怎么办 网银转账被骗了怎么办 支付宝被骗了钱怎么办 被支付宝骗了钱怎么办 头发出油怎么办小妙招 照相的时候脸歪怎么办 怀孕两个月同床了怎么办 小姐被警察抓了怎么办 我的世界迷路了怎么办 砸到手指甲很痛怎么办 手被锤子砸肿了怎么办 拇指突然疼肿了怎么办 手指甲压紫了痛怎么办 砸到手指头肿了怎么办 小婴儿体重不长怎么办 2岁半宝宝不说话怎么办 米兰叶子掉光了怎么办 qq雷霆战机闪退怎么办 微信限额20万怎么办 欧拉方程x<0怎么办 柿子核吃下去了怎么办