Mongrel2=>wsgi网关和助手工具
m2wsgi的Python项目详细描述
此模块为Mongrel2 Web服务器提供了一个WSGi网关处理程序, 允许在Mongrel2上轻松部署Python应用程序。它提供了充分的支持 对于分块响应编码、大文件上传的流式读取,以及 事件I/O LA事件的可插拔后端。
您还可能发现它的支持类对于开发非wsgi很有用 python中的处理程序。
命令行用法
使用此软件包的最简单方法是作为命令行启动程序:
m2wsgi dotted.app.name tcp://127.0.0.1:9999
这将连接到指定请求端口上的Mongrel2并开始处理 通过指定的wsgi应用程序传递请求。默认情况下,您将 获取一个处理所有请求的工作线程,这可能不是 您需要;增加线程数,如下所示:
m2wsgi --num-threads=5 dotted.app.name tcp://127.0.0.1:9999
如果线程不是您的对象,您可以只启动 处理程序指向同一个zmq套接字并获得相同的效果。更好的是, 您可以使用eventlet对位进行随机排列,如下所示:
m2wsgi --io=eventlet dotted.app.name tcp://127.0.0.1:9999
如果是这样的话,也可以使用–io=gevent。捐款 其他异步后端是最受欢迎的。
编程用法
如果您有更复杂的需求,可以在 申请。主要类是“wsgihandler”,它提供了一个简单的 服务器接口。上述命令行用法的等效值为:
from m2wsgi.io.standard import WSGIHandler handler = WSGIHandler(my_wsgi_app,"tcp://127.0.0.1:9999") handler.serve()
这里有很多“合理的违约”正在填写。它假设 Mongrel2 Recv套接字位于发送套接字的下一个端口上, 在没有持久标识的情况下连接套接字是可以的。
为了更好地控制处理程序和Mongrel2之间的连接, 创建自己的连接对象。这里我们使用127.0.0.1:9999作为发送 标识为AA-BB-CC的插座,使用127.0.0.2:9992作为接收插座:
from m2wsgi.io.standard import WSGIHandler, Connection conn = Connection(send_sock="tcp://AA-BB-CC@127.0.0.1:9999", recv_sock="tcp://127.0.0.1:9992") handler = WSGIHandler(my_wsgi_app,conn) handler.serve()
如果您正在为mongrel2创建非wsgi处理程序,您可能会发现 有用的类:
Connection: represents the connection from your handler to Mongrel2, through which you can read requests and send responses. Client: represents a client connected to the server, to whom you can send data at any time. Request: represents a client request to which you can asynchronously send response data at any time. Handler: a base class for implementing handlers, with nothing WSGI-specific in it.
中间件
如果需要向服务器添加花哨的功能,可以指定其他 应该围绕应用程序应用的wsgi中间件。例如, m2wsgi提供了一个gzip编码中间件,可用于压缩 响应数据:
m2wsgi --middleware=GZipMiddleware dotted.app.name tcp://127.0.0.1:9999
如果您希望以牺牲wsgi遵从性为代价进行额外的压缩,那么 也可以在应用gzip之前执行一些服务器内缓冲:
m2wsgi --middleware=GZipMiddleware --middleware=BufferMiddleware dotted.app.name tcp://127.0.0.1:9999
加载中间件的默认模块是m2wsgi.middleware;指定 从另一个模块加载中间件类的全虚线名称。
设备
此模块还提供了许多预先构建的“设备”-独立的 用于执行特定公共任务的可执行文件。当前可用 设备是:
dispatcher: implements a more flexible request-routing scheme than the standard mongrel2 PUSH socket. response: implements a simple canned response, with ability to interpolate variables from the request.
我们不是已经有了吗?
是的,MungRe2:
有几种现有的WSGI网关。他们没有一个完全满足我的需要。特别是,这个包是透明的 支持:
- chunked response encoding
- streaming reads of large “async upload” requests
- pluggable IO backends (e.g. eventlet, gevent)
它也是专为混血儿设计的。这意味着 它可以免费获得很多功能,而且代码更简单、更轻巧 因此。
例如,没有对线程池和请求队列的显式管理 你可以在cherrypy服务器中找到。相反,你只是开始 尽可能多的线程,让它们都连接到同一个处理程序套接字, 而mongrel2(通过zmq)将自动对它们的请求进行负载平衡。
类似地,没有特殊的主/工作进程安排来支持 完全重新加载处理程序;只需终止旧的处理程序进程并启动 换一个新的。向m2wsgi发送sighup,它将自动关闭并 为一个干净的重新开始转世自己。
当前的错误、限制和要做的事情
虽然还不是很完美似乎大部分都有效:
- Needs tests something fierce! I just have to find the patience to write the necessary setup and teardown cruft.
- It would be great to grab connection details straight from the mongrel2 config database. Perhaps a Connection.from_config method with keywords to select the connection by handler id, host, route etc.
- support for expect-100-continue; this may have to live in mongrel2