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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用ApachePOI将excel文件导入postgreSQL表   java多线程从iText pdf提取文本   winapi Java和SetWindowDisplayAffinity   eclipse juno的java Websphere 6.1插件   java MPAndroidChart:为Y轴提供一些偏移   java中作为参数传递枚举类型的继承   java Gui jframe的工作原理与netbeans不同   使用Bouncy Castle和PDFBox在Java中验证PDF签名   优化缩小Java代码   java无法在安卓中从Firebase取回子数据   返回的java方法?我应该什么时候用?   java错误处理已完成,退出代码为1。与穿过阵列的for循环有关   多线程Java volatile是否阻止缓存或强制执行写缓存?   java Multi-collectItems如何提前终止并返回已收集的项目   java为什么不在服务(请求,响应)中直接调用processRequest(请求,响应)?   java如何从字符串生成int数组?   打印获取用户输入的值并在其他预选文本中显示。JAVA   未显示java DynamicAsper UTF8字符   java Eclipse RCP:不启动应用程序的命令行参数