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 ...
随机推荐
- 2018/7/31-zznuoj-问题 A: A + B 普拉斯【二维字符串+暴力模拟+考虑瑕疵的题意-0的特例】
问题 A: A + B 普拉斯 在计算机中,数字是通过像01像素矩阵来显示的,最终的显示效果如下: 现在我们用01来构成这些数字 当宝儿姐输入A + B 时(log10(A)<50,log10 ...
- C# 调用 python3
1.C# 调用python 本质上是使用命令行运行python 1.1 C# 使用命令行 program.cs using System; using System.Diagnostics; usin ...
- JS 截取地址栏指定字符后的内容
一.获取地址栏路径 var url = window.location.href; 二.截取指定字符后的内容 /** * 截取指定字符后的内容 * @param url 路径 * @param par ...
- 201871010111-刘佳华《面向对象程序设计(java)》课程学习总结
201871010111-刘佳华<面向对象程序设计(java)>课程学习总结 课程学习总结(45分) 经历了一个学期的<面向对象程序设计>课程学习,请每位同学完成以下任务: 点 ...
- c语言1博客作业10
一.本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-3/homework/10101 ...
- 014_STM32程序移植之_L298N电机驱动模块
更改注意: STM32程序移植之L298N电机驱动模块 引脚连接图 STM32引脚 L298N引脚 功能 PA6 ENA 马达A的PWM PA7 ENB 马达B的PWM PA2 IN1 控制马达A P ...
- 鬼子进村 fhq-treap
鬼子进村 fhq-treap 题面 观察题目发现可用平衡树做:每次鬼子拆家即从平衡树中加入被拆的节点:每次村民修房子都向平衡树中删除该节点:每次查询时,只需要求出其后驱与前驱,易知nxt-pre-1为 ...
- 自己实现dup2
转自 http://blog.csdn.net/todd911/article/details/11747097 #include <stdio.h> #include <unist ...
- P1582 倒水,P2158 [SDOI2008]仪仗队——数学,二进制
有n个瓶子,里面都有一升水,但是只想保留k个瓶子,只能两个瓶子里面的水体积相等时才能倒在一个瓶子里:不能丢弃有水的瓶子:瓶子容量无限: 问需要购买几个额外的瓶子才能满足条件: 因为每个瓶子一开始只有一 ...
- 2015 ACM Arabella Collegiate Programming Contest
题目链接:https://vjudge.net/contest/154238#overview. ABCDE都是水题. F题,一开始分类讨论,结果似乎写挫了,WA了一发.果断换并查集上,A了. G题, ...