第一站
文件结构:web---
|--home.py #页面处理函数
|--index.py #主体函数
|--indexPlus.py #主体函数加强版
|--webdaem.py #通过web访问
#!/usr/bin/env python #-*- coding:utf-8 -*- def index(): return "resault is home.index" def home(): return "resault is home.home" def dev(): return "resault is home.dev" def ftp(): return "resault is home.ftp" def nginx(): return "resault is home.nginx"
#!/usr/bin/env python #-*- coding:utf-8 -*- #加载home页面处理模块 import home print "Welcome ......" #用户输入请求的页面url url = raw_input("url: ") #根据用户请求的页面调用home模块里的相应的处理函数 if url == "home/index": ret = home.index() print ret elif url == "home/dev": ret = home.dev() print ret elif url == "home/dev": ret = home.dev() print ret elif url == "home/dev": ret = home.dev() print ret else: print "404"
执行index.py,返回结果如下:
Welcome ...... url: >>>home/dev resault is home.dev Process finished with exit code 0
---------------输入不存在的页面,返回404------------------------
Welcome ......
url:
>>>jlfdsja
404
Process finished with exit code 0
ps:我们可以看到在index.py中,我们是通过if条件判断,遍历整个home中的函数,当页面名==函数名时,调用相应函数,否则返回404.
思考:我们可不可以通过字符串在home模块中直接获取相应的函数。
第二站(getaddr)
以下通过getaddr反射来实现,取代if判断,当home模块增加处理页面的方法时,也不需要修改主体函数index
#!/usr/bin/env python #-*- coding:utf-8 -*- import home print "Welcome to yon ......" url = raw_input("url: ") #url = home/index Controller,action = url.split("/") #action = 字符串 func = getattr(home,action) #返回一个函数赋给func ret = func() print ret
涨姿势:hasaddr(),getaddr(),setaddr(),deladdr() 所有操作仅在内存中进行,称为反射!!(对象可以是类,模块等)
- import home : 将home模块加载至内存一块空间,我们可称之比喻为一个装有home模块中所有函数名容器。
- getaddr(home,"dev") : 通过字符串去home容器中查找其所对应的函数等并返回其在空间中的位置(函数体本身)
- hasaddr(home,"index") : 查找容器中是否存在对应的函数,返回True 或者False
- dir(home):查看容器中内容
- setaddr(home,myfunc,lambda x:x+1) :容器中增加myfunc = lambda x:x+1对象(仅在内存中)
- deladdr(home,"dev") : 容器中删除dev函数(仅在内存中)
改进动态导入模块!
#!/usr/bin/env python #-*- coding:utf-8 -*- import home print "Welcome to yon ......" url = raw_input("url: ") #url = home/index controller,action = url.split("/") #action = 字符串 mod = __import__(controller) #动态导入模块,等同于import 模块名 func = getattr(mod,action) #返回一个函数赋给func ret = func() print ret
第三站(web实现)
#!/usr/bin/env python #-*- encoding:utf-8 -*- from wsgiref.simple_server import make_server def RunServer(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) url = environ["PATH_INFO"] #http://localhost:8000/home/dev 取"dev",令temp = "dev" temp = url.split("/")[1] #导入home模块 import home #去home中查找,是否含有指定的函数 is_exist = hasattr(home,temp) #如果存在指定函数,获取函数,执行并返回值 if is_exist: #获取函数 func = getattr(home,temp) #执行并获取返回值 ret = func() #将函数返回值响应给请求者 return ret else: #指定函数不存在,返回404 return "404 not found!" if __name__ == '__main__': httpd = make_server('', 8000, RunServer) print("Serving HTTP on port 8000...") httpd.serve_forever()
运行webdaem.py,并通过浏览器访问,terminal显示:
Serving HTTP on port 8000... 127.0.0.1 - - [05/Jun/2017 14:12:29] "GET /index HTTP/1.1" 200 21 127.0.0.1 - - [05/Jun/2017 14:12:40] "GET /nginx HTTP/1.1" 200 21 127.0.0.1 - - [05/Jun/2017 14:13:26] "GET /nginx HTTP/1.1" 200 21 127.0.0.1 - - [05/Jun/2017 14:13:27] "GET /nginx HTTP/1.1" 200 21 127.0.0.1 - - [05/Jun/2017 14:16:35] "GET /sjlfl HTTP/1.1" 200 14
浏览器请求显示: