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

你可能感兴趣的文章
Nagios介绍
查看>>
nagios利用NSCient监控远程window主机
查看>>
nagios安装文档
查看>>
nagios服务端安装
查看>>
Nagios自定义监控脚本
查看>>
name_save matlab
查看>>
Nami 项目使用教程
查看>>
Nancy之基于Nancy.Hosting.Aspnet的小Demo
查看>>
NAND NOR FLASH闪存产品概述
查看>>
nano 编辑
查看>>
nanoGPT 教程:从零开始训练语言模型
查看>>
NASA网站曝严重漏洞,或将沦为黑客钓鱼网站?
查看>>
Nash:轻量级、安全且可靠的脚本语言
查看>>
NAS、SAN和DAS的区别
查看>>
NAS个人云存储服务器搭建
查看>>
NAS服务器有哪些优势
查看>>
NAT PAT故障排除实战指南:从原理到技巧的深度探索
查看>>
nat 网卡间数据包转发_你是不是从来没有了解过光纤网卡,它跟普通网卡有什么区别?...
查看>>
NAT-DDNS内网穿透技术,快解析DDNS的优势
查看>>
NAT-DDNS内网穿透技术,快解析DDNS的优势
查看>>