`
san_yun
  • 浏览: 2663581 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

python wsgi,SocketServer ,BaseHTTPServer

 
阅读更多

WSGI

之前对python的HTTP Server的理解有点混乱,既可以通过BaseHTTPServer启动一个python http server,那么python wsgi又是干什么的?今天闲下心来整理一下uwsgi到底是什么?参考python官方文档对WSGI的定义(http://docs.python.org/2/library/wsgiref.html):

The Web Server Gateway Interface (WSGI) is a standard interface between web server software and web applications written in Python。

 

WSGI是一个在web服务器和web应用程序之间的标准接口。其实这个很好理解就像java的Servlet一样,实现了Servlet规范的服务器才是靠谱的java web服务器,python也是,只是定义叫USGI。下面是一个官方文档给的一个例子:

from wsgiref.simple_server import make_server


# A relatively simple WSGI application. It's going to print out the
def simple_app(environ, start_response):
    status = '200 OK'
    headers = [('Content-type', 'text/plain')]

    start_response(status, headers)

    ret = ["%s: %s\n" % (key, value)
           for key, value in environ.iteritems()]
    return ret

httpd = make_server('', 8080, simple_app)
print "Serving on port 8080..."
httpd.serve_forever()

这里用到了wsgiref.simple_server。官方文档:This module implements a simple HTTP server (based on BaseHTTPServer) that serves WSGI applications. Each server instance serves a single WSGI application on a given host and port. If you want to serve multiple applications on a single host and port, you should create a WSGI application that parses PATH_INFO to select which application to invoke for each request. (E.g., using the shift_path_info() function from wsgiref.util.)

可以看到wsgiref.simple_server其实也是基于BaseHTTPServer实现的。

 

关于wsgi的细节可以参考:

http://webpython.codepoint.net/wsgi_tutorial

http://docs.python.org/2/library/wsgiref.html

http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi/

 

SocketServer

SocketServer更简单了,和java的SocketSerer一个意思,参考:http://docs.python.org/2/library/socketserver.html

 

There are five classes in an inheritance diagram, four of which represent
synchronous servers of four types:

        +------------+
        | BaseServer |
        +------------+
              |
              v
        +-----------+        +------------------+
        | TCPServer |------->| UnixStreamServer |
        +-----------+        +------------------+
              |
              v
        +-----------+        +--------------------+
        | UDPServer |------->| UnixDatagramServer |
        +-----------+        +--------------------+

 默认上面这几个类是同步的,如果你打开两个 telnet 会话来连接同一个服务端, 那么第二个会话只有在关闭第一个会话之后才能连接上。如果一个实际的服务端像这个工作,那么什么事都将做不了。这就是为什么大部分实际的服务端都采用线程或子进程来处理多个连接。

   SocketServer 模块定义了两个有用的类来处理多个连接:ThreadingMixIn 和 ForkingMixIn 。一个继承自 ThreadingMixIn 的 SocketServer 类会对每个进来的请求自动产生一个新的线程来处理。而继承自 ForkingMixIn 的子类对每个进来的请求将会自动产生一个新的子进程。个人喜欢 ThreadingMixIn 更甚一点,因为线程比子进程更高效和易移植。同时线程与父线程的通信也比采用子进程来得得更加的容易。

  SocketServer模块已经定义了几个常用的多线程版本SocketServer:

class ForkingUDPServer(ForkingMixIn, UDPServer): pass
class ForkingTCPServer(ForkingMixIn, TCPServer): pass

class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass

 

 

BaseHTTPServer

参考:http://docs.python.org/2/library/basehttpserver.html

 BaseHTTPServer module 定义了两个class用来实现HTTP servers (Web servers)。一般情况下都不是用来直接使用的,因为太简陋了。

 

1.class HTTPServer(server_address, RequestHandlerClass)

HTTPServer是SocketServer.TCPServer的子类,所以也实现 SocketServer.BaseServer接口,他负责创建并监听HTTP socket,把请求转发给handler处理。

 

2.class BaseHTTPRequestHandler(request, client_address, server)

BaseHTTPRequestHandler用来handle HTTP请求,它自己本身并不能实际处理请求,一般通过它子类来处理各种HTTP请求(例如GET,POST), BaseHTTPRequestHandler提供了一系列对象和方法供子类扩展使用。

一个简单的例子:

from  BaseHTTPServer import  HTTPServer
from  BaseHTTPServer import  BaseHTTPRequestHandler

server_address = ('', 8787) #address
handler_class = BaseHTTPRequestHandler #handler

httpd = HTTPServer(server_address, handler_class)
httpd.serve_forever()

 

 下面是一个多线程的例子参考(http://stackoverflow.com/questions/14088294/multithreaded-web-server-in-python):

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
import threading

class Handler(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        message =  threading.currentThread().getName()
        self.wfile.write(message)
        self.wfile.write('\n')
        return

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""

if __name__ == '__main__':
    server = ThreadedHTTPServer(('localhost', 8080), Handler)
    print 'Starting server, use <Ctrl-C> to stop'
    server.serve_forever()

 

 

分享到:
评论

相关推荐

    cpp-modwsgi是一个Apache模块实现了PythonWSGI接口服务

    `cpp-modwsgi` 是一个专为Apache服务器设计的模块,它实现了Python的Web服务器网关接口(WSGI)标准。这个模块,通常称为`mod_wsgi`,使得开发者可以使用Python语言来编写Web应用,并在Apache环境下运行。在本文中,...

    Linux+Django+Python+Wsgi配置过程

    ### Linux+Django+Python+Wsgi配置过程 #### 一、环境准备与系统基本信息 根据提供的文件信息,本文档将详细介绍如何在Linux环境下配置Apache+Mod_Wsgi+Django环境的过程。具体步骤包括软件安装、项目部署等环节。...

    Python WSGI的深入理解

    Python WSGI(Web Server Gateway Interface)是一种标准接口,它定义了Web服务器如何与Web应用程序进行通信。这个规范由PEP 3333提出,旨在简化Python Web开发中的复杂性,让不同的服务器和框架之间能够更好地协同...

    Python-Zappa极大的简化了在AWSLambdaAPI网关上发布所有PythonWSGI应用

    Python-Zappa 是一个开源工具,它为 Python 开发者提供了一种极其便捷的方式,将基于 WSGI(Web Server Gateway Interface)的 Python Web 应用部署到 AWS Lambda 和 API Gateway 上,实现“无服务器”架构。...

    详解如何在Apache中运行Python WSGI应用

    如果我们的Web应用是采用Python开发,而且符合WSGI规范,比如基于Django,Flask等框架,那如何将其部署在Apache中呢?本文中,我们就会介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用。 安装mod_wsgi 我们...

    python+wsgi+apache

    python2.7+Django 1.11 在windows 下部署到apache24 下可用

    Python库 | wsgi_lineprof-0.4.0-cp33-cp33m-manylinux1_x86_64.whl

    标题中的“wsgi_lineprof-0.4.0-cp33-cp33m-manylinux1_x86_64.whl”是一款基于Python的WSGI(Web Server Gateway Interface)性能分析工具,名为wsgi_lineprof。这个库主要用于帮助开发者优化他们的Python WSGI应用...

    eventlet-Python支持 WSGI 的异步框架

    eventlet-Python支持 WSGI 的异步框架

    apache2.2和python2.7的mod_wsgi

    Apache 2.2 和 Python 2.7 之间的交互主要依赖于一个名为 mod_wsgi 的模块,它是 Apache HTTP 服务器的一个扩展,允许在 Apache 上运行 Python Web 应用程序,特别是像 Django 这样的高级 Web 框架。在本场景中,...

    mod_wsgi-3.5

    3. **版本兼容性**:“mod_wsgi-3.5”可能有特定的Python版本要求,例如,可能只支持Python 2.7或Python 3.x的某个子版本。了解这些限制对于正确部署和运行Python应用至关重要。 4. **CPU架构**:此版本可能支持...

    mod_wsgi3.5(按照apache版本,python版本,系统版本选择使用)

    标题“mod_wsgi3.5(按照apache版本,python版本,系统版本选择使用)”指的是mod_wsgi的3.5版本,它是一个用于在Apache web服务器上运行Python应用的模块,特别是Django框架的应用。这个标题强调了在选择和安装mod_...

    cleaver:Python WSGI 应用程序的血腥简单 AB 测试

    切肉刀 Python WSGI 应用程序的血腥简单 A/B 测试: 在一行代码中呈现显示或行为差异。 测量和比较多个变体之间的转化,包括统计显着性。 保证回头客同样的体验。 与现有的身份验证和存储层轻松集成。 Cleaver 的...

    Python库 | wsgi_lineprof-0.8.0-cp37-cp37m-manylinux1_i686.whl

    标题中的“wsgi_lineprof-0.8.0-cp37-cp37m-manylinux1_i686.whl”是一个针对Python的特定版本(3.7)的库,名为wsgi_lineprof,版本号为0.8.0。这个库主要用于Web服务器网关接口(WSGI)应用的性能分析,它提供了...

    mod_wsgi python开发

    `mod_wsgi` 是一款用于在Apache Web服务器上部署和运行Python Web应用程序的模块,它实现了WSGI(Web Server Gateway Interface)标准。WSGI是Python Web应用的通用接口,让Web服务器与Web应用之间能进行通信。通过`...

    python-Python 内置的 WSGI 服务器.rar

    Python内置的WSGI服务器是Python标准库中的一个轻量级Web服务器,主要用于开发和测试目的。WSGI(Web Server Gateway Interface)是一种Web服务器与Web应用之间的接口标准,它定义了两者如何交互,使得不同的Web...

    Windows平台apache24mod_wsgi 部署Python应用

    ### Windows平台Apache 24与mod_wsgi部署Python应用详解 #### 一、概述 在Windows平台上部署Python Web应用时,经常会遇到各种各样的问题。本文将详细介绍如何使用Apache 2.4结合mod_wsgi模块来高效地部署Python...

    yavs-wsgi:另一个VIM设置-Python WSGI版(Django,金字塔,塔架,烧瓶,瓶子等)

    另一个VIM设置-Python WSGI版这是我在新的WSGI开发机器上使用的设置脚本。 随意评论或编辑您认为合适的内容。安装 git clone git://github.com/mlindemu/yavs-wsgi.gitcd yavs-wsgi./yavs-wsgi.sh安装了什么? 以下...

    graphql-wsgi:基于Python WSGI的GraphQL服务器

    到Python和WSGI的端口。 使用 。 有关如何将其用于在Python中创建GraphQL服务器(具有中继支持)的演示,请参见 。 学分 该代码由Martijn Faassen移植。 执照 如何执行测试 python2.7 bootstrap-buildout.py bin/...

Global site tag (gtag.js) - Google Analytics