- 浏览: 164679 次
- 性别:
- 来自: 珠海
最新评论
-
rockone:
start_response()中的status和header ...
初试Python3.0 wsgiref遇到好些问题.. -
zhangdp_neu:
1.文本比较如何处理多关键字搜索?难道也文本比较。如果文本过多 ...
基于文本比较的搜索是否可行? -
sdh5724:
分词是很大的目的是为了减少内存使用。 如果按字符倒排, 也能出 ...
基于文本比较的搜索是否可行? -
Heart.X.Raid:
对于海量数据而言,可行性不大。查询关键字需要对每篇文档进行比较 ...
基于文本比较的搜索是否可行? -
marcolu.1987:
那个,能不能传一份标准切分结果给我,我在学习中文分词,希望得到 ...
分词器源码……M1
接上篇 在Python3.0中处理web请求-继续封装wsgi :
这次加入了Cookies封装,session支持,从线程作用域获取request,response等。目前session还不能被持久化
# -*- coding: utf-8 -*- import socketserver, re, cgi, io, urllib.parse from wsgiref.simple_server import WSGIServer import threading, time, urllib, guid from http.cookies import SimpleCookie ctx = context = threading.local() class AppException(Exception): pass class SessionPool(object): sessionIdKey = "psessionid" """存储Session的地方""" def __init__(self, session_store_time=30): """初始化Session池 @param session_store_time:session存储时间,单位:分钟 """ self.session_store_time = session_store_time self.sessions = {} def getSession(self, key): """从池中获取Session""" if(key in self.sessions): session = self.sessions[key] if(session.isTimeOut()): self.removeSession(session.sessionId) else: return session return None def createSession(self): """创建一个新的Session""" sessionId = self.newSessionId() session = Session(sessionId, self.session_store_time) self.sessions[sessionId] = session return session def removeSession(self, key): """删除Session""" #self.sessions.remove(key) if(key in self.sessions): del self.sessions[key] def newSessionId(self, ip=None): """创建一个新的SessionId""" return guid.generate(ip) def getSessionByCookie(self, cookie, response=None, create=True): """根据Cookie信息找到session""" sessionId = cookie.get(SessionPool.sessionIdKey, None) if(sessionId is not None): sessionId = sessionId.value session = self.getSession(sessionId) if(session is not None): session.lastAccessTime = time.time() return session if(create): session = self.createSession() response.putCookie(SessionPool.sessionIdKey, session.sessionId) return session return None def saveSessions(self): pass class Session(dict): """一个客户端会话""" def __init__(self, sid, store_time): self.sessionId = sid self.lastAccessTime = self.createTime = time.time() self.maxInactiveInterval = store_time # session存储时间,单位:分钟 def isTimeOut(self): """判断是否已超时""" return time.time() - self.lastAccessTime > self.maxInactiveInterval * 60 class Request(object): """保存客户端请求信息""" def __init__(self, env, sessions): self.env = env self.winput = env["wsgi.input"] self.method = env["REQUEST_METHOD"] # 获取请求方法(GET or POST) self.__attrs = {} self.attributes = {} self.encoding = "UTF-8" self.cookies = SimpleCookie(env.get("HTTP_COOKIE","")) self.response = ctx.response self.sessionPool = sessions def __getattr__(self, attr): if(attr == "params" and "params" not in self.__attrs): # 获取客户端请求参数 fp = None if(self.method == "POST"): #如果请求时以POST方式提交的,则以POST方式处理,否则以GET方式处理 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 if(attr == "session" and "session" not in self.__attrs): # 该request中不存在session则创建一个 self.session = self.sessionPool.getSessionByCookie(self.cookies, self.response) return self.session 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 self.cookies = None self.headers = {} def write(self, string): """向流中写数据 @param string:要写到流中的字符串 """ if(self._write is None): __headers = [("Content-type","text/html;charset="+self.encoding)] if(self.cookies is not None): t = ('Set-Cookie', self.cookies.output(header="")) __headers.append(t) for k, v in self.headers.items(): t = (k,v) __headers.append(t) self._write = self.start_response("200 OK", __headers) 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)]) def putCookie(self, key, value, expires=1000000, path='/'): """添加Cookie信息""" if(self.cookies is None): self.cookies = SimpleCookie() self.cookies[key] = urllib.parse.quote(value) self.cookies[key]["expires"] = expires self.cookies[key]['path'] = path def addHeaders(key, value): self.headers[key] = value #WSGIServer必须放在后面…否则没有异步效果 class ThreadingWSGIServer(socketserver.ThreadingMixIn, WSGIServer): """一个使用多线程处理请求的WSGI服务类""" pass class WSGIApplication(object): """WSGI服务器程序""" def __init__(self, urls=None): self.urls = urls # URL映射 self.sessions = SessionPool(1) 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("start request....") #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" response = Response(start_response) ctx.response = response request = Request(env, self.sessions) ctx.request = request # 将request和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=[] print("end request....") 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=False,port=9000) class TestHandler(object): def __init__(self): pass def doGET(self): ctx.request.encoding='UTF-8' session = ctx.request.session if("x" in ctx.request.params): session["x"] = ctx.request.params["x"] #time.sleep(3) ctx.response.write("Hello "+session["x"]) def doPOST(self): #request.encoding='UTF-8' #response.write(request.params["name"]) ctx.response.redirect("/a/x") if __name__=="__main__": main() #input()
发表评论
-
监听文件变化、python和GIL
2009-12-15 22:25 48301、利用windows api对文件系统进行监听 尝试1: ... -
文件版本管理-文件合并
2009-07-15 12:46 1308用过svn或者cvs的人都知道,文件版本冲突的时候应该将两个冲 ... -
在Python3.0中处理web请求-封装wsgi
2009-05-26 13:23 2575闲来无聊,写了一些python3000的wsgi封装的代码,包 ... -
SQLAlchemy-查询
2009-04-27 21:15 8702似乎ORM最难设计的部分是查询。特别是面向对象的查询,今天学习 ... -
SQLAlchemy与Python3.0
2009-04-26 22:47 1834今天开始学习SQLAlchemy, ... -
想设计一个Python的持久层框架
2009-04-24 23:24 1780框架定义在持久层,除 ... -
设计Python数据库连接池1-对象的循环引用问题
2009-04-17 23:25 2359在Python中如果对象定义 ... -
在Python3.0中处理web请求7-文件上传(使用cgi.FieldStorage)
2009-04-12 14:53 4917winput=env["wsgi.in ... -
在Python3.0中处理web请求6-简单的模板引擎
2009-04-06 21:14 1390今天放假在家,外面又在下雨,闲来无事,写了个简单的模板引擎,其 ... -
在Python3.0中处理web请求5-处理cookie
2009-04-06 01:39 1800在处理web请求时,处理Cookie是非常重要的一个环节,要处 ... -
在Python3.0中处理web请求4-回归WSGI
2009-03-31 16:04 1294前面一直使用HTTPServer对web请求进行处理,今天突然 ... -
在Python3.0中处理web请求3-多线程
2009-03-30 14:06 3419继续研究Python3进行处理web请求。在第一篇文章的Hel ... -
pet 0.1 预览版(原PJETalker)
2009-03-29 22:21 1406本打算今天发布一个正式版,但由于遇到一些问题,还要再看看,不过 ... -
在Python3.0中使用HTTPServer处理web请求2-获取请求参数
2009-03-27 14:21 6517继上次用HTTPServer写了一个简单的HTTPHandle ... -
在Python3.0中使用HTTPServer处理web请求
2009-03-25 09:58 10345继昨天发现wsgi在有点问题而无法使用它来处理web请求后,我 ... -
初试Python3.0 wsgiref遇到好些问题..
2009-03-24 13:45 5970今天打算尝试一下python3.0。没想到刚开始就受挫。测试代 ... -
JE API的Python实现 - 0.01
2009-03-20 23:38 1540修正了匆忙之下开发的一些错误。然后加了点东西。 新建confi ...
相关推荐
在实际应用中,`simple-api-management-wsgi-0.1.1`可以与其他WSGI兼容的Web服务器(如uWSGI、Gunicorn等)结合使用,通过这些服务器将API接口暴露给网络。同时,它也可以与其他Python库(如Flask、Django等Web框架...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用
Python 2.7 和 mod_wsgi-win32-ap22py27-3.3.so:在Web开发领域,Python是一种流行的脚本语言,而Apache是广泛应用的HTTP服务器。当需要在Apache服务器上运行Python应用程序时,mod_wsgi模块扮演着关键角色。`mod_...
官方离线安装包,亲测可用
Flask是一个轻量级的Web服务程序,它基于Werkzeug WSGI工具包和Jinja2模板引擎构建,因其简洁易用的特性在Python Web开发中广受欢迎。这个库将financeager与Flask框架集成,旨在提供一套高效、灵活的金融数据处理和...
尽管现在有更现代的解决方案如WSGI(通过mod_wsgi),但mod_python对于理解Web服务器与Python的交互仍具有参考价值。对于初学者来说,这是一个很好的起点,而对于经验丰富的开发者,这可能是一个回顾历史和技术演进...
eventlet-Python支持 WSGI 的异步框架
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
opencv_python-4.5.5-cp310-cp310-win_amd64.whl
资源分类:Python库 所属语言:Python 资源全名:necrophos-wsgi-0.0.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
官方离线安装包,亲测可用
在Windows环境中部署Django web应用通常涉及到多个组件的协同工作,包括Django框架本身、Web服务器(如Apache)以及让Django与Web服务器交互的中间件(如mod_wsgi)。以下是对这些关键知识点的详细解释: 1. **...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
5. **中间件**:中间件是WSGI框架中一种强大的功能,它们可以在请求到达应用和应用发送响应之间插入额外的处理逻辑。这可以用于日志记录、身份验证、性能监控等多种用途。 6. **轻量级**:Python-...
utils-api > wsgi
WSGIserver库支持多线程和异步操作,这使得它在处理并发请求时表现得非常高效。此外,它还提供了SSL加密功能,可以用于创建安全的HTTPS连接。通过WSGIserver,开发者可以快速搭建本地开发环境,或者在生产环境中部署...
官方离线安装包,亲测可用
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装