第一站

文件结构: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:\n")
#根据用户请求的页面调用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 ""

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:\n") #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:\n") #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

浏览器请求显示:

web框架初阶的更多相关文章

  1. Slog27_支配vue框架初阶项目之博客网站-样式居中

    ArthurSlog SLog-27 Year·1 Guangzhou·China July 30th 2018 GitHub 掘金主页 简书主页 segmentfault 没有写够足够的代码量,想成 ...

  2. Nodejs初阶之express

    PS: 2014/09/24 更新<Express 4.X 启航指南>,欢迎阅读和评论:)   老规矩,开头部分都是些自娱自乐的随想,想到哪写到哪... 到今天俺已经在俺厂工作俩年零几天了 ...

  3. 重温ASP.NET WebAPI(一)初阶

    重温ASP.NET WebAPI(一)初阶   前言 本文为个人对WebApi的回顾无参考价值.主要简单介绍WEB api和webapi项目的基本结构,并创建简单地webaapi项目实现CRUD操作. ...

  4. 蜗牛历险记(二) Web框架(中)

    上篇简单介绍了框架所使用的Autofac,采用Autofac提供的Ioc管理整个Web项目中所有对象的生命周期,实现框架面向接口编程.接下来介绍框架的日志系统. 一.介绍之前 框架日志是否有存在的必要 ...

  5. Python Web 框架:Tornado

    1.Tornado Tornado:python编写的web服务器兼web应用框架 1.1.Tornado的优势 轻量级web框架 异步非阻塞IO处理方式 出色的抗负载能力 优异的处理性能,不依赖多进 ...

  6. 7个优秀的国内外移动端web框架(转)

    淘宝SUI Mobile框架   (light7框架 官网:http://www.light7.cn/)官网地址:http://m.sui.taobao.org/ SUI Mobile 是一套基于 F ...

  7. ServiceFramework作为Java Web框架都有哪些不错的设计

    前言 最近需要开发一个纯API的项目,mlsql-cluster,从无到有,到最后完整的proxy功能开发完毕,只花了四个小时不到,自己不尽小感叹了一把 ServiceFramework的高效. 关于 ...

  8. 6 大主流 Web 框架优缺点对比(转)

    英文: Kit Kelly   译文:oschina https://www.oschina.net/translate/web-frameworks-conclusions 是该读些评论和做一些总结 ...

  9. Web框架系列之Tornado

    前言 Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中. Tornad ...

随机推荐

  1. 【python】使用plotly生成图表数据

    安装 在 ubuntu 环境下,安装 plotly 很简单 python 版本2.7+ pip install plotly 绘图 在 plotly 网站注册后,可以直接将生成的图片保存到网站上,便于 ...

  2. waitpid()

    waitpid() pid_t waitpid(pid_t pid, int *status, int options); 参数: pid>0 只等待进程ID等于pid的子进程,不管其它已经有多 ...

  3. 标准库heapq的使用

    转载自: https://blog.csdn.net/y472360651/article/details/80725355 查找最大或最小的N个元素 怎么样从一个列表中取出最大或最小的N个元素的列表 ...

  4. [Google Guava] 7-原生类型

    原文链接 译文链接 译者:沈义扬,校对:丁一 概述 Java的原生类型就是指基本类型:byte.short.int.long.float.double.char和boolean. 在从Guava查找原 ...

  5. 018_STM32程序移植之_串口接收中文

    (一)在平时数据传输中很少用到接收中文的情况,但是最近需要用到就花了半天时间来弄弄 (二)接收原理,从现在接收情况分析:一个中文占两个数据的空间,也就是两个十六进制可以转化成为一个中文 (三)示例情况 ...

  6. 原生JS实现图片上传并预览功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 给json数组添加新字段并赋值

    zNodes.forEach(function(item) { item.newtitle ="点击加号设为主席会场"; });

  8. Java+自动扫描文件夹+发送+上传

    1.介绍enctype enctype 属性规定发送到服务器之前应该如何对表单数据进行编码. enctype作用是告知服务器请求正文的MIME类型(请求消息头content-type的作用一样) 1. ...

  9. Android原生编解码接口 MediaCodec 之——踩坑

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/gb702250823/article/d ...

  10. luogu2885

    P2885 [USACO07NOV]电话线Telephone Wire 给出若干棵树的高度,你可以进行一种操作:把某棵树增高h,花费为h*h. 操作完成后连线,两棵树间花费为高度差*定值c. 求两种花 ...