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:\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() 所有操作仅在内存中进行,称为反射!!(对象可以是类,模块等)
- 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:\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框架初阶的更多相关文章
- Slog27_支配vue框架初阶项目之博客网站-样式居中
ArthurSlog SLog-27 Year·1 Guangzhou·China July 30th 2018 GitHub 掘金主页 简书主页 segmentfault 没有写够足够的代码量,想成 ...
- Nodejs初阶之express
PS: 2014/09/24 更新<Express 4.X 启航指南>,欢迎阅读和评论:) 老规矩,开头部分都是些自娱自乐的随想,想到哪写到哪... 到今天俺已经在俺厂工作俩年零几天了 ...
- 重温ASP.NET WebAPI(一)初阶
重温ASP.NET WebAPI(一)初阶 前言 本文为个人对WebApi的回顾无参考价值.主要简单介绍WEB api和webapi项目的基本结构,并创建简单地webaapi项目实现CRUD操作. ...
- 蜗牛历险记(二) Web框架(中)
上篇简单介绍了框架所使用的Autofac,采用Autofac提供的Ioc管理整个Web项目中所有对象的生命周期,实现框架面向接口编程.接下来介绍框架的日志系统. 一.介绍之前 框架日志是否有存在的必要 ...
- Python Web 框架:Tornado
1.Tornado Tornado:python编写的web服务器兼web应用框架 1.1.Tornado的优势 轻量级web框架 异步非阻塞IO处理方式 出色的抗负载能力 优异的处理性能,不依赖多进 ...
- 7个优秀的国内外移动端web框架(转)
淘宝SUI Mobile框架 (light7框架 官网:http://www.light7.cn/)官网地址:http://m.sui.taobao.org/ SUI Mobile 是一套基于 F ...
- ServiceFramework作为Java Web框架都有哪些不错的设计
前言 最近需要开发一个纯API的项目,mlsql-cluster,从无到有,到最后完整的proxy功能开发完毕,只花了四个小时不到,自己不尽小感叹了一把 ServiceFramework的高效. 关于 ...
- 6 大主流 Web 框架优缺点对比(转)
英文: Kit Kelly 译文:oschina https://www.oschina.net/translate/web-frameworks-conclusions 是该读些评论和做一些总结 ...
- Web框架系列之Tornado
前言 Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中. Tornad ...
随机推荐
- Nginx的简单了解与使用
一.产生背景 我们日常生活中经常遇到的问题 这是几年前的12306,现在的12306基本上不会出现这样的问题了 上述场景产生的主要 2 大原因:1.巨大流量2.单台服务器资源和能力有限在海量并发的环境 ...
- Python 常用的ORM框架简介
ORM概念ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去.这样,我们在具体的操作实体对象的时候,就不需 ...
- 字符串的新方法——includes() padStart() padEnd()
ES6为字符串提供了一个新方法,叫做String.prototype.includes('要包含的字符串'),如果包含,则返回字符串,否则返回false 使用ES6中的字符串新方法String.pro ...
- C语言I 博客作业03
这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 作业要求 我在这个课程的目标是 掌握关系运算.if-else语句.格式化输入语句scanf(),以及常用的数学库函数 这个作业在那个具体方 ...
- mysql基础篇--库的管理
库的创建 create database [if not exists] 库名; 库的修改 alter database 库名 character set 字符集; #更改库的字符集 库的删除 dro ...
- vue编辑、新增弹框(引用外部页面)
vue编辑.新增弹框(引用外部页面) 2018年06月15日 09:37:20 会飞的猪biubiu 阅读数 10265 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...
- java+web+多级文件上传
文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...
- ueditor+粘贴word
Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法 ...
- ZR#954 分组
ZR#954 分组 解法: 设 $ f[i][a][b] $ 表示考虑了排序后的前 $ i $ 个人,目前已经有 $ a $ 个组配好了,还有 $ b $ 个组只有组员没有组长的最小代价.转移时,考虑 ...
- 令人窒息的操作,nodejs面向对象。
// async函数返回一个 Promise 对象,可以使用then方法添加回调函数. // 当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句. clas ...