博客
关于我
Swift的WSGI Application到对应的Controller
阅读量:167 次
发布时间:2019-02-28

本文共 3215 字,大约阅读时间需要 10 分钟。

proxy-server将根据请求中的信息调用相应Controller中的数据进行处理。
# /swift/proxy/server.pyclass Application(object):    def __call__(self, env, start_response):        """        WSGI entry point.        Wraps env in swob.Request object and passes it down.        :param env: WSGI environment dictionary        :param start_response: WSGI callable        """        try:            if self.memcache is None:                self.memcache = cache_from_env(env, True)            req = self.update_request(Request(env))            #处理消息入口            return self.handle_request(req)(env, start_response)    def handle_request(self, req):                try:                #根据请求中的信息得到相应Controller中的函数                handler = getattr(controller, req.method)                getattr(handler, 'publicly_accessible')            except AttributeError:                allowed_methods = getattr(controller, 'allowed_methods', set())                return HTTPMethodNotAllowed(                    request=req, headers={'Allow': ', '.join(allowed_methods)})            if 'swift.authorize' in req.environ:                resp = req.environ['swift.authorize'](req)                if not resp and not req.headers.get('X-Copy-From-Account') \                        and not req.headers.get('Destination-Account'):                    del req.environ['swift.authorize']                else:                    if not getattr(handler, 'delay_denial', None):                        return resp            req.environ['swift.orig_req_method'] = req.method            调用相应Controller中的函数进行处理            return handler(req)
与对象的三个层次相对应,分别有三种Controller:AccountController、ContainerController以及ObjectController,这三种Controller的实现都位于swift/proxy/controllers目录。
以AccountController为例:
#swift/proxy/controllers/account.pyclass AccountController(Controller):    def PUT(self, req):        """HTTP PUT request handler."""        if not self.app.allow_account_management:            return HTTPMethodNotAllowed(                request=req,                headers={'Allow': ', '.join(self.allowed_methods)})        error_response = check_metadata(req, 'account')        if error_response:            return error_response        if len(self.account_name) > constraints.MAX_ACCOUNT_NAME_LENGTH:            resp = HTTPBadRequest(request=req)            resp.body = 'Account name length of %d longer than %d' % \                        (len(self.account_name),                         constraints.MAX_ACCOUNT_NAME_LENGTH)            return resp        #account_ring即为Proxy Server在初始化时为Account创建的Ring        #get_nodes()返回包含该Account内容的Partition        account_partition, accounts = \            self.app.account_ring.get_nodes(self.account_name)        headers = self.generate_request_headers(req, transfer=True)        clear_info_cache(self.app, req.environ, self.account_name)        #make_requests()会首先获得包含该parttion及其副本的所有节点,然后依次将请求发送到每个节点,直到其中一个节点返回正确的结果为止        resp = self.make_requests(            req, self.app.account_ring, account_partition, 'PUT',            req.swift_entity_path, [headers] * len(accounts))        self.add_acls_from_sys_metadata(resp)        return resp
参考
https://www.ibm.com/developerworks/cn/cloud/library/1310_zhanghua_openstackswift/index.html

转载地址:http://ylej.baihongyu.com/

你可能感兴趣的文章
mysql添加表注释、字段注释、查看与修改注释
查看>>
mysql清理undo线程_MySQL后台线程的清理工作
查看>>
mysql清空带外键的表
查看>>
MySQL清空表数据
查看>>
mysql源码安装
查看>>
Mysql源码安装过程中可能碰到的问题
查看>>
MySQL灵魂16问,你能撑到第几问?
查看>>
MySQL灵魂拷问:36题带你面试通关
查看>>
mysql状态分析之show global status
查看>>
mysql状态查看 QPS/TPS/缓存命中率查看
查看>>
mysql生成树形数据_mysql 实现树形的遍历
查看>>
mysql用于检索的关键字_Mysql全文搜索match...against的用法
查看>>
MySQL用得好好的,为什么要转ES?
查看>>
MySql用户以及权限的管理。
查看>>
MySQL用户权限配置:精细控制和远程访问的艺术!------文章最后有惊喜哦。
查看>>
mysql用户管理、常用语句、数据分备份恢复
查看>>
MySQL留疑问:left join时选on还是where?
查看>>
mysql登陆慢问题解决
查看>>
Mysql百万级数据查询优化
查看>>
MySQL的 DDL和DML和DQL的基本语法
查看>>