闲来无聊,写了一些python3000的wsgi封装的代码,包括封装url匹配,客户请求参数,跳转,响应流的封装等,少说废话。上代码:
# -*- coding: utf-8 -*-
import socketserver, re, cgi, io, urllib.parse
from wsgiref.simple_server import WSGIServer
class AppException(Exception):
pass
class Request(object):
"""保存客户端请求信息"""
def __init__(self, env):
self.env = env
self.winput = env["wsgi.input"]
self.method = env["REQUEST_METHOD"] # 获取请求方法(GET or POST)
self.__attrs = {}
self.attributes = {}
self.encoding = "UTF-8"
def __getattr__(self, attr):
if(attr == "params" and "params" not in self.__attrs):
fp = None
if(self.method == "POST"):
content = self.winput.read(int(self.env.get("CONTENT_LENGTH","0")))
#fp = io.StringIO(content.decode(self.encoding))
fp = io.StringIO(urllib.parse.unquote(content.decode("ISO-8859-1"),encoding=self.encoding))
self.fs = cgi.FieldStorage(fp = fp, environ=self.env, keep_blank_values=1)# 创建FieldStorage
self.params = {}
for key in self.fs.keys():
self.params[key] = self.fs[key].value
self.__attrs["params"] = self.params
return self.__attrs[attr]
class Response(object):
"""对客户端进行响应"""
def __init__(self, start_response, write = None):
self.encoding = "UTF-8"
self.start_response = start_response
self._write = write
def write(self, string):
"""向流中写数据
@param string:要写到流中的字符串
"""
if(self._write is None):
self._write = self.start_response("200 OK", [("Content-type","text/html;charset="+self.encoding)])
self._write(string.encode(self.encoding).decode("ISO-8859-1"))
def redirect(self, url):
"""跳转"""
if(self._write is not None):
raise AppException("响应流已写入数据,无法进行跳转。")
self.start_response("302 OK", [("Location",url)])
class ThreadingWSGIServer(WSGIServer, socketserver.ThreadingMixIn):
"""一个使用多线程处理请求的WSGI服务类"""
pass
class WSGIApplication(object):
"""WSGI服务器程序"""
def __init__(self, urls=None):
self.urls = urls # URL映射
def getHandlerByUrl(self, url):
"""根据URL获取处理程序,如果没有找到该处理程序则返回None"""
url = url.replace("//","/") # 避免输入错误引起的url解释错误
urlArr = url.split('/')
for setUrl in self.urls.keys():
setUrlArr = setUrl.split("/")
#print(setUrl.replace("*",r'\w*'))
if(len(setUrlArr) == len(urlArr)):
for i in range(len(urlArr)):
if(i == len(urlArr) - 1 and
(setUrlArr[i] == '*' or setUrlArr[i] == urlArr[i] or
('*' in setUrlArr[i] and re.search(setUrlArr[i].replace("*",r'\w*'),urlArr[i])))):
return self.urls[setUrl]
if(setUrlArr[i] == '*' or setUrlArr[i]==' '):
continue;
if(setUrlArr[i] != urlArr[i]):
break;
def make_app(self):
"""建立WSGI响应程序"""
def wsgi_app(env, start_response):
#print(";\n".join([k+"="+str(v) for k, v in env.items()]))
url = env["PATH_INFO"] # 获取当前请求URL
handlerCls = self.getHandlerByUrl(url)
if(handlerCls is None):
# 未经定义的url处理
start_response("500 OK", [("Content-type","text/html;charset=utf-8")])
return "Error URL"
if(not hasattr(handlerCls,"doGET") and not hasattr(handlerCls,"doPOST")):
# 映射错误
start_response("500 OK", [("Content-type","text/html;charset=utf-8")])
return "Error Mapping"
request = Request(env)
response = Response(start_response)
try:
handler = handlerCls(request, response)
except TypeError as e:
handler = handlerCls()
methodName = "do" + request.method
returnValue = None
try:
returnValue = getattr(handler,methodName)(request, response)
except TypeError as e:
returnValue = getattr(handler,methodName)()
if(returnValue is None):
returnValue=[]
return returnValue
return wsgi_app
def make_server(self, serverIp='', port=8080, test=False):
"""建立一个默认服务器
@param test: 是否只是做一次测试
"""
from wsgiref.simple_server import make_server # 加载模块
httpd = make_server(serverIp, port, self.make_app(), server_class=ThreadingWSGIServer)
if test: # 如果只是测试
httpd.handle_request() # 处理单次请求
else:
httpd.serve_forever() # 处理多次请求
return True
def main():
app = WSGIApplication(urls={"/a/*":TestHandler, "/a/b/*.do":TestHandler})
app.make_server(test=True)
class TestHandler(object):
def __init__(self):
pass
def doGET(self, request=None, response=None):
request.encoding='UTF-8'
response.write("Hello")
def doPOST(self, request=None, response=None):
#request.encoding='UTF-8'
#response.write(request.params["name"])
response.redirect("/a/x")
if __name__=="__main__":
main()
#input()
后面的是一些简单的测试。
发现可能是做JAVA做得太多的关系,越看越像servlet api。。呵呵
分享到:
- 2009-05-26 13:23
- 浏览 2566
- 评论(2)
- 论坛回复 / 浏览 (2 / 3550)
- 查看更多
相关推荐
在实际应用中,`simple-api-management-wsgi-0.1.1`可以与其他WSGI兼容的Web服务器(如uWSGI、Gunicorn等)结合使用,通过这些服务器将API接口暴露给网络。同时,它也可以与其他Python库(如Flask、Django等Web框架...
Flask是一个轻量级的Web服务程序,它基于Werkzeug WSGI工具包和Jinja2模板引擎构建,因其简洁易用的特性在Python Web开发中广受欢迎。这个库将financeager与Flask框架集成,旨在提供一套高效、灵活的金融数据处理和...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
资源分类:Python库 所属语言:Python 资源全名:necrophos-wsgi-0.0.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Python 2.7 和 mod_wsgi-win32-ap22py27-3.3.so:在Web开发领域,Python是一种流行的脚本语言,而Apache是广泛应用的HTTP服务器。当需要在Apache服务器上运行Python应用程序时,mod_wsgi模块扮演着关键角色。`mod_...
尽管现在有更现代的解决方案如WSGI(通过mod_wsgi),但mod_python对于理解Web服务器与Python的交互仍具有参考价值。对于初学者来说,这是一个很好的起点,而对于经验丰富的开发者,这可能是一个回顾历史和技术演进...
16-WSGI、mini_frame(web框架)(python和linux高级编程阶段 代码和截图)16-WSGI、mini_frame(web框架)(python和linux高级编程阶段 代码和截图)16-WSGI、mini_frame(web框架)(python和linux高级编程阶段 ...
官方离线安装包,亲测可用
opencv_python-4.5.5-cp310-cp310-win_amd64.whl
资源分类:Python库 所属语言:Python 资源全名:buildbot-wsgi-dashboards-1.5.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:necrophos-wsgi-0.0.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
官方离线安装包,亲测可用
在Python web开发中,WSGI(Web Server Gateway Interface)是一种标准接口,用于web服务器与web应用之间的通信。这个接口定义了一种规范,使得不同的服务器和应用程序可以协同工作,提高了代码的可移植性和灵活性。...
WSGIserver库支持多线程和异步操作,这使得它在处理并发请求时表现得非常高效。此外,它还提供了SSL加密功能,可以用于创建安全的HTTPS连接。通过WSGIserver,开发者可以快速搭建本地开发环境,或者在生产环境中部署...
5. **中间件**:中间件是WSGI框架中一种强大的功能,它们可以在请求到达应用和应用发送响应之间插入额外的处理逻辑。这可以用于日志记录、身份验证、性能监控等多种用途。 6. **轻量级**:Python-...
安装完成后,可以在Python代码中导入并根据文档或示例配置和启动Web服务器。 总之,rc-webserver是一个专为Python设计的Web服务器库,它提供了构建Web服务所需的基本功能,并且可能具有高度可定制性和扩展性,以...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
它实现了HTTP缓存规范中的部分内容,比如ETag、Last-Modified等策略,允许服务器在处理请求时避免不必要的计算和I/O操作,从而提高响应速度。 **WSGI标准** WSGI是Python web开发的一个标准接口,它定义了Web...
wsgi_lineprof库是性能调优的重要工具,它允许开发者精确地测量每个WSGI应用处理请求时的代码执行时间。这对于找出应用中的性能瓶颈非常有用。通常,性能剖析会涉及对代码的每一行或每一函数进行计时,以便确定哪些...
7. **性能优化**:考虑到Web应用的性能,WebStack可能提供了如Gunicorn这样的生产级WSGI服务器,它可以并发处理多个请求,提升Web应用的响应速度。 8. **部署与扩展**:WebStack的可扩展性使得开发者可以轻松添加新...