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集合属性值   java字符串==运算符是否比较引用?   java是否存在过太多的ListView或适配器?   json获取java中类路径中下载的文件   我可以用java代码解决数据库并发问题吗?   在多个线程中使用forEach()或使用forEach()和lambdas进行java集合迭代   java输出JFrame中的整个循环   java禁用高度详细的日志记录   java在没有特定属性的对象中访问模型的值   java Smack xmpp建立连接   处理过时域对象引起的并发问题的java策略(Grails/GORM/Hibernate)   java从ObservableList中提取元素   使用图像进行java相似图像搜索   java ListView和图像:我快疯了   在Java中,如何从毫秒时间戳中提取一天的周期?   java我需要这样的设计,但我面临两个问题   java如何获取JGoodies FormLayout中的单元格大小   Spring引导生成的java War文件未部署到Weblogic 12c