Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请问chap11的RPC2的作用是? #4

Open
YanAnzouyijun opened this issue Aug 23, 2016 · 5 comments
Open

请问chap11的RPC2的作用是? #4

YanAnzouyijun opened this issue Aug 23, 2016 · 5 comments

Comments

@YanAnzouyijun
Copy link

你好,读了你的著作对openstack有了更进一步的了解,提个建议吧,你可以对一些书上没说的代码,在代码目录里加个readme,这样有助于读者理解。。。。

@JiYou
Copy link
Owner

JiYou commented Aug 29, 2016

@YanAnzouyijun RPC2应该是RPC的一个简单一些代码实验。当时觉得如果RPC看懂了,看这个小例子应该不会是障碍,所以就留在这了。

@YanAnzouyijun
Copy link
Author

@JiYou 非常感谢作者大大,竟然回我了哎~~~~没有白买书~还有作者大大啥时候出一本关于agent的书啊,讲讲l3agent 和openstack调优之类~~~
另外,我对于书里的第11章中的wsgi_instance这个例子,我有2点不能理解;
1.
def factory(cls, global_config, **local_config):
print " Auth:",local_config
print " Auth:",global_config
def _factory(app):
return cls(app)
return _factory
这个app参数是怎么传进去的啊?我看global_config,local_config都没有app参数。
2.加载api-paste.ini的时候不是应该先过滤后执行app的代码吗?为什么我打印出来的效果是先执行app的工厂方法,后执行过滤器的工厂方法,我这一点不是很理解;

@JiYou
Copy link
Owner

JiYou commented Nov 18, 2016

@YanAnzouyijun 最近手头事情比较多。这里只是简单回复一下思路。不一定正确,你可以去尝试验证一下。

factory方法的执行顺序

_factory方法只是说构建好一个类的instance。并不是说立马让这个类的instance开始工作。
如果要让这个类的instance开始工作,应该是需要查看__call__方法的。

所以,构建的顺序,与类开始工作的顺序不一定是完全一致的。

参数的传递

class Auth(object):

    def __init__(self, app):
        self.app = app

    @classmethod
    def factory(cls, global_config, **local_config):
        def _factory(app):
            return cls(app)
        return _factory

这里是一个类,其构造函数里面是需要有一个app参数的。而接下来的def factory方法,返回的是一个方法_factory(类似于C语言的函数指针)。这个函数方法的参数就是一个app。

有没有发现:

  • 构造函数需要的参数是app
  • 工厂方法返回的函数指针,需要的参数也是app。

这是因为,工厂方法嘛,要制造一个类的instance出来,肯定是需要一个参数的。那么这个参数怎么来的?

这个就是需要看PasteDeploy这个包的实现。我猜测是这样实现的。以api-paste.ini为例:

[pipeline:main]
pipeline = auth instance
[filter:auth]
paste.filter_factory = middleware:Auth.factory
[app:instance]
paste.app_factory = routers:app_factory

这里会先构建尾巴最后一个app的instance。然后把这个instance做为一个参数,传给auth的构建函数做为参数,然后把auth类的instance给制造出来。你可以自己验证一下。

@JiYou
Copy link
Owner

JiYou commented Nov 18, 2016

@YanAnzouyijun 小建议,github是支持代码格式的。你只需要看看markdown的语法就可以了。(不复杂,5分钟包会)

@YanAnzouyijun
Copy link
Author

@JiYou 非常感谢~~~~~~
第一个问题昨天我验证过了,代码的流程确实如你所说,你提供的思路,也让我明白了很多,真的非常感谢
第二个github支持代码格式,我立马去学下,非常感谢~~~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants