博客
关于我
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/

你可能感兴趣的文章
nginx看这一篇文章就够了
查看>>
Nginx知识详解(理论+实战更易懂)
查看>>
Nginx简单介绍
查看>>
Nginx系列6之-rewirte功能使用案例总结
查看>>
nginx线程模型理解
查看>>
nginx自动摘除和恢复后端服务,进行自动检测
查看>>
NGINX自动清理180天之前的日志
查看>>
Nginx虚拟主机配置
查看>>
Nginx虚拟目录配置文件(包含PHP配置与重写)
查看>>
Nginx访问控制_登陆权限的控制(http_auth_basic_module)
查看>>
nginx访问控制配置
查看>>
nginx负载均衡
查看>>
Nginx负载均衡
查看>>
Nginx负载均衡与动静分离架构实现
查看>>
Nginx负载均衡和F5的区别---系统运维工作笔记001
查看>>
nginx负载均衡和反相代理的配置
查看>>
nginx负载均衡器处理session共享的几种方法(转)
查看>>
nginx负载均衡的5种策略
查看>>
nginx负载均衡的5种策略(转载)
查看>>
nginx负载均衡的五种算法
查看>>