WSGI 的可插拔梦 已翻译 100%

renwofei423 投递于 2013/08/06 17:25 (共 22 段, 翻译完成于 09-11)
阅读 4363
收藏 85
4
加载中

作为一个Python Web开发者你一直接触着“WSGI”这个术语(存在6年后还没有一个正式的决断,与“威士忌”的处境差不多,一些人认为是发音的略写,其他就称它为PEP 333)。WSGI的出现是件震惊的事,通过指定一个网关层Python web应用可以和任何服务器应用一起使用。

事实上,它变得如此受欢迎和对Python的友好支持类似与其他语言创造协议一样。第一个是Ruby上的Rack,后来是Javascript的Jack/JSGI,Perl的PSGI/Plack以及其他等等。然而,自从WSGI为大家所熟知作为web应用协议时人们就试图尝试新方案代替它。这是为什么呢,为什么没有能取代它的呢?

Garfielt
Garfielt
翻译于 2013/08/09 13:32
1

WSGI是“Webserver Gateway Interface”的简写,它真真的设想是成为服务器和应用程序之间的桥梁。此外,PEP解释了如何使用中间件技术,这是新的开始。PEP还建议人们围绕WSGI写框架,许多人就是这样做的。多年来人们试图把越来越多的服务纳入WSGI层都取得了不同层次的成功,如会话中间件、认证系统、缓存层等等。许多人的观点是使用WSGI层这种方式将多个应用程序联系在一起。

Garfielt
Garfielt
翻译于 2013/08/09 13:39
1

WebOb走得更远。只要你所有应用程序只使用WebOb,那么你不需额外的任何东西便可以把请求对象“附加”到WSGI环境中WSGI链的任何一个点上,而且你是在相同的基础请求对象和数据上操作。但是,这是远超出WSGI所指定和鼓励范围的。

将WebOb应用与Django、Werkzeug或其他选择混合也尽量避免。

考虑这篇文章对个人想法的倾覆,它可能是非结构化、未充分斟酌的,这样有一个原因:它是一个你越深入思考越多细节会被了解的主题。WSGI本身是很简单的一个规范,但围绕它的东西很多,它们真的可以让你头痛。

这部分我重写了好几次,但现在我还是不满意,所以按它的原样理解它吧。

Garfielt
Garfielt
翻译于 2013/08/14 11:15
1

WSGI打破了什么

看看WSGI之前的API或者新的但不支持WSGI的框架,它们中常见的模式是有一个request对象,这个对象不仅可以访问请求的数据还允许你将数据发送回客户端,例如,有write()方法。WSGI初期便打破了这种模式,这是重要的一步,因为它意味着你可以使用内部缓存以及改变API使用迭代器。

在Python中有个情况就是你不能手工停止一帧中执行的程序除非使用greenlets,但在2004年greenlets还没出现。因此你不能简单地将一个API这样转化到WSGI:

def my_view(request):
    request.start_response('200 OK')
    request.send_header('Content-Type', 'text/plain')
    request.end_headers()
    request.write('Hello World!')
    request.write('Goodbye World!')
    request.end()

直接完全等效的例子是这样的:

def my_view(environ, start_response):
    def generate():
        yield 'Hello World!'
        yield 'Goodbye World!'
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return generate()
Garfielt
Garfielt
翻译于 2013/08/14 11:27
1

现在确实可以在迭代器中利用greenlets转换多个函数未yield,但你依旧不会这么做。所以你可以想象当WSGI出来时那是这种境况的一个多么大的转化挑战。

如果你看看其他被WSGI启发的协议,你可以看到迭代器概念的调整和修改。在Python中迭代通过对迭代器方法的调用开始工作直到它的发出完成信号。Ruby是截然相反的。你提供了一个函数然后传递给调用这个函数直到运行完毕的迭代器。Ruby有一个漂亮的有点,你不需要迭代器就可以很容易地将Rack接口转换成旧的write+flush方法对。

这就是有些人想到的WSGI时不满意东西。

Garfielt
Garfielt
翻译于 2013/08/14 12:16
1

WSGI 怪异模式(也称之为兼容模式)

当你问别人他们对于WSGI 的观点是什么,他们通常会告诉你start_response()这个callable 接口很差劲。而且他们说我们可以舍弃它,这相当正确。但在盲目的丢弃它之前,你应该先搞清楚为什么它是首先创建的。通常是带着状态码调用start_response()的,以字符串+表达式,以及一个键-值对列表构成的头部。但很多人忽略的是,start_response()可以做的远不止那些!

super0555
super0555
翻译于 2013/08/12 15:52
1
首先,记得我说过你不可以用response.write()显式的生成yield语句。当REP写好以后,对于需要通过request.write()输出数据流的现存应用来说,它很明显会成为一个问题。而且由于start_response()被赋予的返回值很多开发者都不了解。start_response()返回的是一个函数,这个函数直接写到客户端的流中。当然这个问题可以以一种不同的方式解决,例如通过将此函数放入WSGI 环境,不过这里的意图很简单,就是说启动这个响应的调用者获得这个函数。
super0555
super0555
翻译于 2013/08/12 17:42
1

你用过直接写函数么?我也没用过,因为有一些好的理由:它绕过了中间件处理,因为它直接写入了输出流。但是它设定了通往WSGI标准之路,因为它是一个简单方式的WSGI风格的CGI脚本。例如mercurial hg的web接口是那个写函数的高级用户。

但是那不是start_response()结束的地方。它有第三个参数,人们通常忘记了这个参数:exc_info。这个参数很少使用,因为错误通常被堆栈中更高一级处理,但是这个的目的显然是使服务器意识到错误存在。这里是一个例子,这个东西如何工作:你开始了response,准备发射数据,但是出错了,你可以改变你的主意,再次启动响应,这次包含一些错误信息。你也可能从未启动过响应,而直接通知它们错误。为啥是这样?这里融合了另外一个事实:头不是发送的,头是设置的。

李勇2
李勇2
翻译于 2013/09/07 21:00
1

异步确认

理论上说,作为一种协议WSGI设计上也是支持异步应用的。当你启动响应的时候,事实上你并没有启动响应。你告诉服务器你想发送的头部消息,但是它们并没有真的被发送,直到你给出一个非空的字符串。这使你可以在更晚的时间点,将已存在的200 OK提示修改为500 INTERNAL SERVER ERROR。例如这下面是完美验证的WSGI代码:

def weird_app(environ, start_response):
    try:
        start_response('200 OK', [('Content-Type', 'text/plain')])
        yield ''
        yield ''
        raise Exception('Something went wrong late')
    except Exception, e:
        start_response('500 INTERNAL SERVER ERROR',
                       [('Content-Type', 'text/plain')],
                       sys.exc_info())
        yield 'Application Failed'
super0555
super0555
翻译于 2013/08/31 15:03
1

这是你在现实中不会看到的极端例子。如果没有发送,或者由错误的条件恢复成任何可能的状态,服务器会尝试修改头部消息。“当非空字符串给出时,头部消息被发送出”规则仅仅是一个纯粹的异步响应,可以用这种规则给出空字符串,以告知并没有准备好。我不知道这是否是故意如此,但是PEP对此非常接受,提出它是用于异步系统的,因此我想可能是有人考虑到它的。

不过一般在现实中你永远也不会发现它的这种特殊用途。它只是使处理WSGI代码比需要的更困难罢了。

super0555
super0555
翻译于 2013/08/31 15:18
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(10)

renwofei423
renwofei423

引用来自“Windoze”的评论

这翻译…………小学语文是体育老师教的么?

如果觉得不行,你可以继续翻译更好的版本,点“仅英文”,翻译即可。
francis-x
francis-x
跟OSGI有关系嘛?
晒太阳的小猪
晒太阳的小猪
自由软件让软件科学作为科学应有的开放和独立性。同时我们也可以看到越来越多的创新其实是在自由软件的范围内完成的,这些自发的研究和人的精力的投入是一两个商业公司无法完成的!!经管它们也做出了努力。但社区的努力也是无法小视的!!!
Windoze
Windoze
这翻译…………小学语文是体育老师教的么?
yangh44
yangh44
ee
hphper
hphper

引用来自“邪猫”的评论

可抽插的梦想。。

意思其实一样,换成您这个更有神韵,也更吸引人
邪猫
邪猫
可抽插的梦想。。
大尾巴
大尾巴
这是干货
renwofei423
renwofei423
终于翻译完成了,推荐Pythoner好好看看!
返回顶部
顶部