第一站

文件结构: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. 单元测试框架之unittest(二)

    一.摘要 本章笔者将详细介绍组织测试代码的相关内容,所用的测试例子会是冒泡排序,笔者在从业这么久之后回想很多面试都要问冒泡排序,虽然不知道为什么要问这个,但还是希望大家掌握,它与自动化测试关系不大属于 ...

  2. 2014年9月9日 高级命令command的使用(上)

    上次说到了菜单 工具条按钮 上下文菜单都已经改为用command的方式去做了,这次稍微详细地说说. 在command的实现拓展点handler上右键,可以看到有enabledWhen,activeWh ...

  3. 接口强制删除namespace 为Terminating的方法

    kubectl get ns qa01 -o json > qa01.json kubectl proxy --port=8081 curl -k -H "Content-Type: ...

  4. HTMl5的存储方式sessionStorage和localStorage区别及联系

    localStorage 和 sessionStorage 属性允许在浏览器中存储 key/value 对的数据. localStorage 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手 ...

  5. linux笔试题

    1. cron 后台常驻程序 (daemon) 用于: A. 负责文件在网络中的共享 B. 管理打印子系统 C. 跟踪管理系统信息和错误 D. 管理系统日常任务的调度 2. 在大多数Linux发行版本 ...

  6. DbVisualizer用JDBC连接SQL Server

    1.安装驱动,解压后得到jar文件 Drivers 4.1 and 4.0 for SQL Serve http://www.microsoft.com/en-us/download/confirma ...

  7. Friends (ZOJ - 3710)

    Problem Alice lives in the country where people like to make friends. The friendship is bidirectiona ...

  8. Grafana +Zabbix 系列二

    Grafana +Zabbix 系列二 Grafana 简介补充 Grafana自身并不存储数据,数据从其他地方获取.需要配置数据源 Grafana支持从Zabbix中获取数据 Grafana优化图形 ...

  9. 微信小程序之简单记账本开发记录(六)

    昨天虽然将页面成功的搭建出来 但是其中的增删改查功能没有实现,需要到逻辑页面,即js页面注册一下 效果如下图

  10. UVALive 3716 DNA Regions ——(式子变形)

    一开始直接想到了二分,写了一发然后过了全部样例就交了,果断WA.因为这个问题显然是不满足单调性的. 然后想之前刚做的斜率优化DP,但是那个是求斜率最大值,不是求满足斜率大于一定值的最大长度的.也构造不 ...