web框架初阶

第一站

文件结构: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"
home.py
#!/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

执行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        
indexPlus

涨姿势:hasaddr(),getaddr(),setaddr(),deladdr() 所有操作仅在内存中进行,称为反射!!(对象可以是类,模块等)

  1. import home : 将home模块加载至内存一块空间,我们可称之比喻为一个装有home模块中所有函数名容器。
  2. getaddr(home,"dev") : 通过字符串去home容器中查找其所对应的函数等并返回其在空间中的位置(函数体本身)
  3. hasaddr(home,"index") : 查找容器中是否存在对应的函数,返回True 或者False
  4. dir(home):查看容器中内容
  5. setaddr(home,myfunc,lambda x:x+1) :容器中增加myfunc = lambda x:x+1对象(仅在内存中)
  6. 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

浏览器请求显示:

 

原文地址:https://www.cnblogs.com/chbo/p/6944693.html