web框架之利用python的反射模拟小web框架(一)
关于反射函数:
getattr(object, name[,default])
获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。如果是返回的对象的方法,返回的是方法的引用名称(地址),如果需要调用这个方法,要在后面添加一对括号
setattr(object, name, values)
给对象的属性赋值,若属性不存在,先创建再赋值。只是在该对象的内存空间创建属性并且赋值。并且参数二参数必须是字符串,参数三还可以是lambda函数,相当于在这个对象的内存空间里添加一个函数名称为name的函数(name= lambda x : x+1)
hasattr(object, name)
判断一个容器(对象)里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。name必须为字符串
delattr(object, name)
删除object对象名为name的属性,name为字符串
关于反射的机制:
针对下面这个例子来说,首先import home,将model文件里的内容(函数名称,在没运行该函数前只是导入了函数名字,可以通过dir()查看,这些函数名字)导入到内存,而getattr,setattr,hasattr只是针对内存里的成员(函数名字)进行操作,也就是说如果用反射函数操作过的对象的内存名称空间在reload操作后,会被覆盖掉重新载入home,总而言之,反射函数操作的是容器在内存中的成员(例如的类属性的名字,对象属性的名字)
web服务器端入口(webdemo.py):
扫描二维码关注公众号,回复: 1036391 查看本文章
# _*_coding:utf-8_*_
from wsgiref.simple_server import make_server
import home
def RunServer(environ, start_response):
start_response('200 OK',[('Content-Type','text/html')])
url = environ['PATH_INFO']
temp = url.split('/')[1]
#temp是一个字符串
is_exist = hasattr(home,temp)
if is_exist:
func = getattr(home,temp)
#返回的只是在home对象的内存里的成员,即func属性的名称,由于该属性是个方法,所以调用时要加括号
ret = func()
return ret
else:
return '404 not found!!!'
if __name__ == '__main__':
httpd = make_server('',8001,RunServer)
print 'Serving HTTP on port 8000'
httpd.serve_forever()
web后端控制模块(home.py):
# _*_coding:utf-8_*_
def index():
with open('index.html') as f:
str = f.readlines()
return str
视图部分(index.html):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<h1>index</h1>
</body>
</html>