第一站

文件结构: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. MySQL进阶8 分页查询(limit) - 【SQL查询语法执行顺序及大致结构】- 子查询的3个经典案例

    #进阶8 分页查询 /* 应用场景: 当要显示的数据,一页显示不全,需要分页提交sql请求 语法: select 查询列表 #7 from 表1 #执行顺序:#1 [join type join 表2 ...

  2. Selenium(十一)使用EXCEL读取用户数据和生成测试报表

    1.下载两个模块 2.xlrd的使用方法 3.使用excel获取数据 在userdata文件中增加代码: login.py: 4.使用excel生成测试报表 举例: 在log_module中定义函数: ...

  3. JS 截取地址栏指定字符后的内容

    一.获取地址栏路径 var url = window.location.href; 二.截取指定字符后的内容 /** * 截取指定字符后的内容 * @param url 路径 * @param par ...

  4. 标准库heapq的使用

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

  5. tap 事件会触发两次问题

    因项目中使用 coffeeScript (http://coffee-script.org/),此处记录下用 coffeeScript 语法解决 tap 事件触发两次的问题. 在 id="b ...

  6. STL练习板子题(c++11警告)

    第一题 词典 总时间限制: 3000ms 内存限制: 65536kB 描述 你旅游到了一个国外的城市.那里的人们说的外国语言你不能理解.不过幸运的是,你有一本词典可以帮助你. 输入 首先输入一个词典, ...

  7. ueditor+粘贴word

    Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...

  8. learning express step(四)

    learning express route function const express = require('express'); const app = express(); app.get(' ...

  9. 51Nod 1701 最后的机会

    1701 最后的机会 给定一字符串S,S非空,由小写字母组成,设v为S中元音字母的个数,c为辅音字母的个数."a", "e", "i", & ...

  10. 【概率论】1-2:计数方法(Counting Methods)

    title: [概率论]1-2:计数方法(Counting Methods) categories: Mathematic Probability keywords: Counting Methods ...