您的位置:首页 > 编程语言

与WSGI中的中间件相关的一段代码的解释

2010-04-25 22:12 225 查看
理解下面的几行代码:

#python code snippet
app = web.application(url_mapping)

app.run(partial(ThreadControl, thread_mapping=thread_mapping))

def run(self, *middleware):
return wsgi.runwsgi(self.wsgifunc(*middleware))

def wsgifunc(self, *middleware, **kw):
def wsgi(env, start_resp):
pass

for m in middleware:
wsgi = m(wsgi)

return wsgi

class ThreadControl(object):
def __init__(self, func, thread_mapping):

def __call__(self, env, start_resp):
print env...#do something
return self.func(env, start_resp)


先看看partial函数的定义:

def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc


说明partial函数返回了一个新的函数地址,执行时实际上是调用了传给partial的第一个参数。

再返回到第一段代码,在第4行中第一个参数ThreadControl是调用对象,后面的thread_mapping是传递给ThreadControl的参数,但是这时还没有生成ThreadControl类的实例。依次调用时第7行中的middleware就是一个新的函数地址了,这个函数已经有了一个参数,即thread_mapping,到14行时调用了这个新的函数,同时又给它传递了另外一个参数,即wsgi,当然这里的wsgi也是一个函数地址。这样ThreadControl类初始化需要的两个参数都齐全了,到这里才生成ThreadControl类的实例。所以在第16行返回的是ThreadControl类的实例。当这个实例被调用时(比如flup的fcgi_base.py中的result = self.application(environ, start_response)),就会执行21行的__call__函数,这样就完成了中间件的功能。记住传进来的func是一个函数wsgi,所以func可以被调用,因为wsgi的定义需要两个参数env和start_resp,所以23行调用时也要传给func两个参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: