python_原始_web框架
创:10_4_2017
修:
什么是web框架?
-- 本质上是socket,用户请求来,业务逻辑处理,返回处理结果
-- 包含socket或者不包含socket的框架
什么是wsgi?
-- web框架网关接口,Django、flask没有自带socket, tronado框架自带socket
-- python中有 wsgiref模块自带socket服务,在python3使用该模块会有问题
如何写一个简单的web框架?
-- 导入 wsgi模块
-- 定义主逻辑处理函数,主函数中获得请求url和定义回复请求逻辑
-- 判断URL,然后把符合要求的URL分给对应的处理函数
-- 在主函数中返回 对应函数处理结果
-- 在mian函数中实例服务对象并启动web服务
#!/usr/bin/python2
# -*- coding:utf-8 -*-
from wsgiref.simple_server import make_server def home():
return 'home' def index():
return 'index' def RunServer(environ, start_response):
start_response('200 ok', [('Content-Type', 'text/html')])
print environ['PATH_INFO']
url = environ['PATH_INFO'] if url == '/home':
return home()
elif url == '/index':
return index() if __name__ == '__main__':
httpd = make_server('', 9999, RunServer)
httpd.serve_forever() # URL每次都要判断,当URL有太多的时候,就出来很多重复代码
# 如果再加入数据库操作,就显得有点杂乱,逻辑结构混乱,如何解决?
# 不妨先把URL和对应函数进行归类
上面的服务有问题,哪些问题?URL和处理函数放在了一起,有点乱
#!/usr/bin/python2
# -*- coding:utf-8 -*-
from wsgiref.simple_server import make_server # 导入wsgi模块 def home():
with open('home.html', 'r') as f: # 打开文件,读进来
data = f.read()
return data # home逻辑处理 def index():
return 'welcome to index' # index逻辑处理 URLS = { # url和函数之间通过字典建立映射关系
'/home': home,
'/index': index,
} def RunServer(environ, start_response): # 对请求url处理与匹配
start_response('200 ok', [('Content-Type', 'text/html')])
url = environ['PATH_INFO'] if url in URLS.keys(): # 判断url是否在URLS中
func = URLS[url] # 在就调用处理函数
return func() # 返回处理结果
else:
return '404' # 不在返回错误404 if __name__ == '__main__':
httpd = make_server('', 9999, RunServer)
httpd.serve_forever() # 虽然实现了不对主逻辑函数修改,只需要修改URL字典,就可以解决匹配问题
# 逻辑结构不混乱,但是处理函数和URL过多的话,全写在一个页面,不太容易维护与阅读,如何实现?
# 不妨把各自功能写在一个.py文件中,然后通过各自导入不就实现了分类,逻辑清晰?
# 不妨把url写在一个url.py文件中,处理函数写在ccontrollers中,返回的html写在view目录中,不就解决这个问题了?
先建立yizhihua目录,保存目录下__init__.py文件,在yizhihua目录下面建立如下文件
- urls.py 写入
from yizhihua import controllers URLS = { # url和函数之间通过字典建立映射关系
'/home': controllers.home,
'/index': controllers.index,
}
- start.py 写入 -启动程序入口
#!/usr/bin/python2
# -*- coding:utf-8 -*-
from wsgiref.simple_server import make_server # 导入wsgi模块
from yizhihua import urls # 导入urls模块 def RunServer(environ, start_response): # 对请求url处理与匹配
start_response('200 ok', [('Content-Type', 'text/html')])
url = environ['PATH_INFO'] if url in urls.URLS.keys(): # 判断url是否在URLS中
func = urls.URLS[url] # 在就调用处理函数
return func() # 返回处理结果
else:
return '404' # 不在返回错误404 if __name__ == '__main__':
httpd = make_server('', 9999, RunServer)
httpd.serve_forever()
- controllers.py 写入 - 逻辑处理函数
from jinja2 import Template
import os def home():
with open(os.path.join('views', 'home.html'), 'r',) as f: # 打开文件,读进来
result = f.read()
template = Template(result) # 实例渲染对象
data = template.render({'user_list':['18', 'beauty', 'hehe'], 'name':'yizhua'}) # 渲染模版
return data.encode('utf-8') # 字符转码 def index():
with open(os.path.join('views', 'index.html'), 'r') as f: # 打开文件,读进来
data = f.read()
return data # index逻辑处理 # os.path.join() 把两个字符拼成路径
- view目录 ,在此目录下保存html文件,模版文件
- home.html 写入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
<h1>{{name}}</h1>
<ul>
{% for item in user_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
- index.html 写入
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index页面</title>
</head>
<body>
<h1>index</h1>
</body>
</html>
- models.py 暂时不写入, 主要用于写数据表结构,和数据库交互
然后启动start模块,访问 http://127.0.0.1:9999/home 或 http://127.0.0.1:9999/index 获得返回的页面
框架中有哪些模块?
-- models 数据库相关操作
-- views 模版html文件
-- controllers 业务逻辑
其实是把代码进行逻辑分类,通过其中各自相互导入,实现整体性,上面是mvc框架
-- models 数据库相关处理
-- views 业务逻辑
-- Tempates 模版html文件
这个就是MTV框架,本质上和MVC一样,只是名字不一样
如何实现动态向模版中传入参数?
-- 替换一个值 自定义{{item}} ,然后通过字符替换data.replace({{item}}, ‘替换值’)
-- 循环替换
模版语言有哪些模块?
jinja2模块,模版语言
-- pip install jinja2
- 导入 from jinja2 import Template
- 把读进来的结果传给template template = Template(读进来的结果)
- 把结果渲染 data = template.render({字段1 :值1,列表 2 :列表值 2}) 字典形式
替换值: 在模版中把 {{ 字段1 }} 的位置替换成值1
循环:{% for item in 列表2 %}
{{ item }}
{% endfor %} 在模版中循环每次把列表值2放入{{ item }}的位置
- 一般写在html中,然后在逻辑函数
--渲染完成之后,后面要转码 .decode(‘utf-8’)
python_原始_web框架的更多相关文章
- python_接口自动化测试框架
本文总结分享介绍接口测试框架开发,环境使用python3+selenium3+unittest+ddt+requests测试框架及ddt数据驱动,采用Excel管理测试用例等集成测试数据功能,以及使用 ...
- Django _web框架本质
Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. socket服务端 import ...
- 大数据计算框架Hadoop, Spark和MPI
转自:https://www.cnblogs.com/reed/p/7730338.html 今天做题,其中一道是 请简要描述一下Hadoop, Spark, MPI三种计算框架的特点以及分别适用于什 ...
- [ 转载 ] Python Web 框架:Django、Flask 与 Tornado 的性能对比
本文的数据涉及到我面试时遇到过的问题,大概一次 http 请求到收到响应需要多少时间.这个问题在实际工作中与框架有比较大的关系,因此特别就框架的性能做了一次分析. 这里使用 2016 年 6 月 9 ...
- <关于并发框架>Java原生线程池原理及Guava与之的补充
原创博客,转载请联系博主! 转眼快两个月没有更新自己的博客了. 一来感觉自己要学的东西还是太多,与其花几个小时写下经验分享倒不如多看几点技术书. 二来放眼网上已经有很多成熟的中文文章介绍这些用法,自己 ...
- 基于IDEA采用springboot+Mybatis搭建ssm框架简单demo项目的搭建配置流程
一.通过对比可以原始SSM搭建流程,spring boot省去了大量的配置,极大提高了开发者的效率.原始SSM框架搭建流程见博客: https://www.cnblogs.com/No2-explor ...
- 客户端热更新框架之UI热更框架设计(下)
上一篇笔者介绍了关于什么是热更新,为什么需要热更新的技术文章.本篇就专门针对UI框架的热更新功能实现部分展开讨论,讨论的重点是热更新如何与UI框架进行结合? 现在笔者把设计“UI热更新框架”的整体设计 ...
- 【2018】Python面试题【web框架】
1.谈谈你对http协议的认识. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使 ...
- Python三大主流框架的对比
相信做Python这一块的程序员都有听说这三个框架,就像神一样的存在,每一个框架的介绍我就不写出来了,感兴趣可以自己百度了解了解!下面我就说正事 Django:Python 界最全能的 web 开发框 ...
随机推荐
- [编织消息框架][rpc]使用篇
rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服务,传相应参数,返回内容就可以 而提供者根据调用相应服务同参数,工作处理后响应内容即可 根据他们的关系可以用JAVA 接口同实现类 ...
- htmlunit 导致高cup占用的坑
原文:http://blog.csdn.net/qq_28384353/article/details/52974432#reply 将爬虫部署到服务器上运行后,在查看服务器的状态监控时发现,天猫爬虫 ...
- 学好UI你必须要掌握这些技术
转自:http://blog.sina.com.cn/s/blog_15da22ed10102x0gx.html ui设计现在已经是设计行业中的瞩目之星,无论在PC端.移动端还是游戏上都是大放异彩. ...
- C#集合的应用以及和数组比较,它的好处有哪些
我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类.我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和 ...
- MySQL之乱码问题解决详解
今天在写一个项目的时候,在数据库中手动插入数据不会产生中文乱码,但是通过javaWeb却出现乱码,把提交表单和响应中的乱码问题解决后,还是乱码.所以我锁定一定是我的mysql数据库中出现了乱码的现象.
- vSphere在RedHat6.0上搭建Oracle 11g R2 RAC环境
一.前期准备工作 1.1 为方便操作,装完系统后我们先安装Vmware Tools: 1.1.1.安装工具 在VMware的菜单栏上选择"虚拟机/安装虚拟机工具(VM/Install VMw ...
- 算法模板——平衡树Treap 2
实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣 ...
- How to set up Tensorflow inception-v3 model on Windows
There is Inception-v3 model python implementation on GitHub at: https://github.com/tensorflow/models ...
- JavaScript数据结构——队列的实现
前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现. 队列是一种特殊的线性 ...
- cuda事件的使用
cudaEvent_t start,stop; cudaEventCreate(&start);//创建事件 cudaEventCreate(&stop); cudaEventReco ...