import util import context urls = ( '/home', 'home', ) class home: def get(self): return '<h1>I am the home</h1>' class application: def __init__(self, mapping=(), fvars={}, autoreload=None): self.mapping=list(util.group(mapping, 2)) self.fvars=fvars; def run(self,host=8000): from wsgiref.simple_server import make_server httpd = make_server('', host, self.wsgifunc()) print "Serving HTTP on port "+str(host)+" ...." # 开始监听HTTP请求: httpd.serve_forever() def wsgifunc(self, *middleware): def wsgi(env, start_resp): self._load(env) path=context.ctx.path fn,args=self._match(self.mapping, path) start_resp('200 OK', [('Content-Type', 'text/html')]) cls=self.fvars[fn] method=getattr(cls(),'get') return method() return wsgi def _load(self,env): ctx=context.ctx ctx.__dict__.clear() ctx.status = '200 OK' ctx.ip = env.get('REMOTE_ADDR') ctx.method = env.get('REQUEST_METHOD') ctx.path = env.get('PATH_INFO') if env.get('QUERY_STRING'): ctx.query = '?' + env.get('QUERY_STRING', '') else: ctx.query = '' ctx.ip = env.get('REMOTE_ADDR') ctx.method = env.get('REQUEST_METHOD') def _match(self, mapping, value): for path, action in mapping: if isinstance(action,basestring): if str(path).find(value)!=-1: return action,None return None a=application(urls,globals()) a.run(8800) if __name__ == '__main__': pass
context文件:
import threading ctx=threading.local()
感觉这python要搞个web框架,还挺简答的,
application(urls,globals()) 这里一定要把 globals 传进去,否则找不到控制的类,通过这
cls=self.fvars[fn] method=getattr(cls(),'get') return method()
来根据字符串的 类名找到对应的类,然后反射获取 get方法来执行
python 的 globas还是真是挺奇怪的东西