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

python WSGI

 
阅读更多

WSGI是作为Web服务器与Web应用程序或应用框架之间的一种低级别的接口 。WSGI is the Web Server Gateway Interface. It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that

 

WSGI有两方:“服务器 ”或“网关”一方,以及“应用程序”或“应用框架”一方。WSIG架构:


WSGI 中间件 同时实现了API的两方,因此可以在WSGI服务和WSGI应用之间起调解作用,“中间件”组件可以执行以下功能:

  • 重写环境变量 后,根据目标URL ,将请求消息路由到不同的应用对象。
  • 允许在一个进程 中同时运行多个应用程序或应用框架。
  • 负载均衡 和远程处理,通过在网络 上转发请求和响应消息。
  • 进行内容后处理,例如应用XSLT 样式表。

 

 

 

用Python 语言写的一个符合WSGI的“Hello World ”应用程序如下所示:

def hello_world_app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return "Hello world!\n"
  • 第一行定义了一个名为app的callable, 接受两个参数,environ和start_response,environ是一个字典包含了CGI中的环境变量,start_response也是一 个callable,接受两个必须的参数,status(HTTP状态)和response_headers(响应消息的头)。
  • 第二行调用了start_response,状态指定为“200 OK”,消息头指定为内容类型是“text/plain”
  • 第三行将响应消息的消息体返回。

调用这个程序

from wsgiref.simple_server import make_server
httpd = make_server('', 8080, hello_world_app)
print "Serving on port 8080..."

# Serve until process is killed
httpd.serve_forever()
 

完整的代码:

 

#/bin/py

from wsgiref.simple_server import make_server

def hello_world_app(environ, start_response):
    status = '200 OK' # HTTP Status
    headers = [('Content-type', 'text/plain')] # HTTP Headers
    start_response(status, headers)

    # The returned object is going to be printed
    return ["Hello World"]

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

# Serve until process is killed
httpd.serve_forever()

访问地址: http://localhost:8080/

 

参考

http://smartzxy.iteye.com/blog/734050

http://zh.wikipedia.org/wiki/Web%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BD%91%E5%85%B3%E6%8E%A5%E5%8F%A3

 

更多关于BaseServer的解释:

 

BaseServer: 定义基础服务器接口,这些功能接口提供给子类继承。同时提供服务处理的骨架
serve_forever() 循环调用 handle_request()
handle_request() 调用子类的get_request() ,在tcpServer时实则进行accept()应答; 验证处理 verify_request();
最终处理请求 process_request(),
verify_request() 虚函数
process_request() 虚函数,这个函数并没有直接在BaseServer的子类TcpServer中被重载,而是在TcpServer的派生类中通过另一个父类来实
现,比如 ThreadingTCPServer的基类ThreadingMixIn.process_request()实现了此功能函数
finish_request(request, client_address) 执行一次完整的socket数据读入处理,如果是ThreadMixInTcpServer产生的request,这个方法内必须实行循环读取 socket数据,直到socket关闭。(此处 request 就是 socket对象)
def finish_request(self, request, client_address):
“”"Finish one request by instantiating RequestHandlerClass.”"”
self.RequestHandlerClass(request, client_address, self)在finish_request里面便将读取socket数据的任务扔给了RequestHandler去处理了,代码可以跳过去看了
##———————————————

TcpServer: tcp服务器
__init__(self, server_address, RequestHandlerClass) 需要提供服务侦听地址和请求处理类对象
server_bind() 绑定服务器地址
server_activate() 激活服务器
server_close() 关闭服务器
fileno() 返回服务器socket的句柄fd编号
get_request() 接收应答accept()
close_request(request) 关闭socket,request即为socket对象

三种输出处理方式: 阻塞方式、线程处理(ThreadingMixIn)、进程处理(ForkingMixIn)

ThreadingMixIn: 线程模型
process_request( request, client_address) 为请求的链接创建新的线程,在创建线程时直接指定线程入口和参数:
import threading
t = threading.Thread(target = self.process_request_thread,
args = (request, client_address))
if self.daemon_threads:
t.setDaemon (1)process_request_thread() 线程处理socket入口,负责接收数据,代码实现有点绕,看看代码
def process_request_thread(self, request, client_address):
try:
self.finish_request(request, client_address)
self.close_request(request)
except:
self.handle_error(request, client_address)
self.close_request(request)ThreadingMixIn其实就是线程代理, 还是调用finish_request()进入处理tcp数据的循环,处理完成便close_request()。但是finish_request和 close_request并未在ThreadingMinxIn内定义,在哪里呢? 通过研读ThreadingTcpServer,原来通过ThreadingTcpServer这个finish_request又跑回了 BaseServer.finish_request()

ThreadingTCPServer(ThreadingMixIn, TCPServer) 装配成线程池处理的tcp服务器

BaseRequestHandler: 请求处理基础对象,提供统一的行为接口实现处理socket数据。 BaseRequestHandler比较好玩,在构造函数内完成了所有的操作,见代码: def __init__(self, request, client_address, server):
self.request = request
self.client_address = client_address
self.server = server
try:
self.setup()
self.handle()
self.finish()
finally:
sys.exc_traceback = None # Help garbage collectionsetup()对应的子类会进行初始化处理
self.handle() 直接调用子类的处理函数,可以参考 BaseHTTPRequestHandler(SocketServer.StreamRequestHandler)::handle()

StreamRequestHandler(BaseRequestHandler) 流式socket处理类
setup() 设置好socket对象和读写文件句柄 rfile/wfile

HTTPServer(SocketServer.TCPServer) http服务器

BaseHTTPRequestHandler(SocketServer.StreamRequestHandler) 流式的请求处理类
handle() 处理入口,在基类BaseRequestHandle()的构造函数中直接调用
handle_one_request() 如果不是处理一次则返回false。接收一次socket数据,解析parse_request(),调用对应的do_xxx事件

python 的daemon线程:

如果一个进程的主线程运行完毕而子线程还在执行的话,那么进程就不会退出,直到所有子线程结束为止,如何让主线程结束的时候其他子线程也乖乖的跟老 大撤退呢?那就要把那些不听话的人设置为听话的小弟,使用线程对象的setDaemon()方法,参数为bool型。True的话就代表你要听话,我老大 (主线程)扯呼,你也要跟着撤,不能拖后腿。如果是False的话就不用那么听话了,老大允许你们将在外军命有所不受的。需要注意的是 setDaemon()方法必须在线程对象没有调用start()方法之前调用,否则没效果。
转载过来以后用

  • 大小: 10.6 KB
分享到:
评论

相关推荐

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

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

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

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

    Python WSGI的深入理解

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

    Linux+Django+Python+Wsgi配置过程

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

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

    本文中,我们就会介绍如何使用Apache模块mod_wsgi来运行Python WSGI应用。 安装mod_wsgi 我们假设你已经有了Apache和Python环境,在Linux或者Mac上,那第一步自然是安装。在Ubuntu或Debian环境中,你可以使用apt-...

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

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

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

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

    mod_wsgi-3.5

    2. **mod_wsgi**:作为Apache服务器的模块,mod_wsgi负责处理Python WSGI应用。它允许Python开发者将他们的应用程序直接部署到Apache服务器上,提供了高性能、稳定性和安全性的保障。 3. **版本兼容性**:“mod_...

    Windows平台apache24mod_wsgi 部署Python应用

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

    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应用...

    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)应用的性能分析,它提供了...

    Python库 | wsgi_cache-0.2-py2.6.egg

    **Python库wsgi_cache介绍** `wsgi_cache`是一个针对WSGI(Web Server Gateway Interface)应用的缓存库,主要用于提升后端应用的性能。它实现了HTTP缓存规范中的部分内容,比如ETag、Last-Modified等策略,允许...

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

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

    Python 200行代码实现简单的WebServer,还支持图片加载源码WSGI

    本主题将深入探讨如何使用Python编写一个简单的Web服务器,该服务器还具备加载图片的功能,并基于WSGI(Web Server Gateway Interface)协议。首先,让我们理解WSGI的基本概念。 WSGI是Python Web应用的标准接口,...

    Python库 | zope.app.wsgi-3.4.3.tar.gz

    《Python库解析:zope.app.wsgi-3.4.3》 在Python的世界里,库扮演着至关重要的角色,它们极大地丰富了Python的功能并提高了开发效率。今天我们要深入探讨的是名为`zope.app.wsgi`的一个特定版本——3.4.3。这个库...

    PyPI 官网下载 | mod_wsgi-httpd-2.4.12.6.tar.gz

    `mod_wsgi` 是一个将 Python 应用程序集成到 Apache Web 服务器的模块,它允许开发者以高性能的方式运行基于 Python 的 Web 服务。在本案例中,我们讨论的是 `mod_wsgi-httpd-2.4.12.6.tar.gz` 文件,这是一个从 ...

    python_wsgi_application

    Python WSGI (Web Server Gateway Interface) 应用程序是一种标准接口,用于在Python中构建Web应用程序和服务。WSGI是Python社区广泛接受的规范,它定义了Web服务器如何与Web应用进行通信,允许开发者集中精力编写...

    可用mod_wsgi-4.5.19+ap24vc14-cp35-cp35m-win_amd64.zip

    标题"可用mod_wsgi-4.5.19+ap24vc14-cp35-cp35m-win_amd64.zip"提及的是一个可使用的mod_wsgi软件包的特定版本,版本号为4.5.19,它针对Apache 2.4(标记为ap24)且基于VC14编译器构建,适用于Python 3.5(cp35代表...

Global site tag (gtag.js) - Google Analytics