python_web框架
一、web框架
web框架:
- 自己完成socket的web框架:如,Tornado等
- 由WSGI完成socket的web框架:如,Django、flash等
两种实现过程:

第二种WSGI方式的,由于自带socket所以可直接写后端代码。
python标准库提供的独立WSGI服务器称为wsgiref,其他的一些接口格式:
'cgi': CGIServer,
'flup': FlupFCGIServer,
'wsgiref': WSGIRefServer,
'waitress': WaitressServer,
'cherrypy': CherryPyServer,
'paste': PasteServer,
'fapws3': FapwsServer,
'tornado': TornadoServer,
'gae': AppEngineServer,
'twisted': TwistedServer,
'diesel': DieselServer,
'meinheld': MeinheldServer,
'gunicorn': GunicornServer,
'eventlet': EventletServer,
'gevent': GeventServer,
'geventSocketIO':GeventSocketIOServer,
'rocket': RocketServer,
'bjoern' : BjoernServer,
'auto': AutoServer,
一个WSGI :(web框架最最最基础版:hello word!)
from wsgiref.simple_server import make_server def RunServer(environ, start_response): # web 框架
# environ 参数,里面包含了用户请求的所有信息
start_response('200 OK',[('Content_Type','text/html')])
return ['<h1>Hello,web!</h1>'.encode()] if __name__=='__main__': # wsgi
# 创建socket server对象
httpd = make_server('', 8000,RunServer) # make_server 封装用户信息传给 environ 参数,里面包含了请求的所有信息
print('serving http on port 8000') # 只要有请求进来,执行RunServer函数
httpd.serve_forever() # while循环等待用户请求
二、自定义web框架
from wsgiref.simple_server import make_server def RunServer(environ, start_response): # web 框架
# environ 参数,里面包含了用户请求的所有信息
start_response('200 OK',[('Content_Type','text/html')])
url=environ['PATH_INFO']
if url == '/index/':
return ['index'.encode()]
elif url == '/news/':
return ['news'.encode()]
else:
return [''.encode()] if __name__=='__main__': # wsgi
# 创建socket server对象
httpd = make_server('', 8000,RunServer) # make_server 封装用户信息传给 environ 参数,里面包含了请求的所有信息
print('serving http on port 8000..') # 只要有请求进来,执行RunServer函数
httpd.serve_forever() # while循环等待用户请求
自定义1号
from wsgiref.simple_server import make_server def f1():
return ['<h1>F1</h1>'.encode()] def f2():
return ['<h1>F2</h1>'.encode()]
# 定义的规则
routers={
'/index/':f1(),
'/news/':f2()
}
def RunServer(environ, start_response): # web 框架
# environ 参数,里面包含了用户请求的所有信息
start_response('200 OK',[('Content_Type','text/html')])
url=environ['PATH_INFO']
if url in routers.keys():
func_name = routers[url]
return func_name
else:
return ['<h1>404</h1>'.encode()] if __name__=='__main__': # wsgi
# 创建socket server对象
httpd = make_server('', 8000,RunServer) # make_server 封装用户信息传给 environ 参数,里面包含了请求的所有信息
print('serving http on port 8000..') # 只要有请求进来,执行RunServer函数
httpd.serve_forever() # while循环等待用户请求
自定义2号
from wsgiref.simple_server import make_server def f1(): # t1.html可以改为t1.tpl,两种写法,tpl=template
f=open('D:/1.pycharm/day2019_03_06/templates/t1.html', 'rb') # 注意这里是以二进制的形式读出
data=f.read()
f.close()
return [data,] def f2():
return ['F2'.encode()] routers={
'/index/': f1(),
'/news/': f2()
}
def RunServer(environ, start_response): # web 框架
start_response('200 OK',[('Content_Type','text/html')])
url=environ['PATH_INFO'] if url in routers.keys():
func_name = routers[url]
return func_name # python3注意这里不能写为函数,返回的直接是这个值
else:
return ['<h1>404</h1>'.encode()] if __name__=='__main__': # wsgi
# 创建socket server对象
httpd = make_server('', 9000,RunServer) # make_server 封装用户信息传给 environ 参数,里面包含了请求的所有信息
print('serving http on port 9000..') # 只要有请求进来,执行RunServer函数
httpd.serve_forever() # while循环等待用户请求
自定义3号
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Word</title>
</head>
<body>
<div sytle="color:red;"><h1>我是一只小鸭子啦啦啦啦。。</h1></div>
<hr/>
<input type="text" value="请输入文字" />
<input type="button" value="提交"/>
</body>
</html>
自定义3号所要的HTML代码
三、jinja2
jinja2是一个模板系统,它提供了特殊的语法就能使用它进行语言的渲染
在jinja2中,存在的三种语法:
- 控制结构{% %}
- 变量取值{{ }}
- 注释(# #)
例:jinja2对HTML的处理称为:模板引擎进行的模板渲染
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我是女生生</title>
</head>
<body>
<h1>hello</h1>
<hr/>
<h1>{{name}}</h1>
<ul>
{%for item in user_list%}
<li>{{item}}</li>
{%endfor%}
</ul>
</body>
</html>
XXOO.html
渲染: 相互整合
from wsgiref.simple_server import make_server
from jinja2 import Template
def f1():
return ['<h1>ok</h2>'.encode()] def f2():
f=open('D:/1.pycharm/day2019_03_06/jinjia_222/XXOO.html', 'rb')
result = f.read()
result = result.decode()
template = Template(result)
# jinja2 渲染:接收值,进行特特殊的替换
data = template.render(name='Presely', user_list = ['oo','xx'] )
return [data.encode()] # 定义规则
routers={
'/index/': f1(),
'/news/': f2()
}
def RunServer(environ, start_response): # web 框架
start_response('200 OK',[('Content_Type','text/html')])
url=environ['PATH_INFO'] if url in routers.keys():
func_name = routers[url]
return func_name # 注意这里不能写为函数,返回的直接是这个值
else:
return [''.encode()] if __name__=='__main__': # wsgi
# 创建socket server对象
httpd = make_server('', 8000,RunServer) # make_server 封装用户信息传给 environ 参数,里面包含了请求的所有信息
print('serving http on port 8000..') # 只要有请求进来,执行RunServer函数
httpd.serve_forever() # while循环等待用户请求
渲染
有关jinja2:https://www.cnblogs.com/dachenzi/p/8242713.html
四、web框架之MVC/MTV

本质上两个所指的框架是一个样的;

Django所用模式就是MTV模式,但需要额外的定义url映射关系
python_web框架的更多相关文章
- Python_web框架解析
这一阵正在学习廖雪峰老师的实战课程,这里对其中web.py框架进行一些分析,总结一下学到的东西. 这一部分的课程网站:http://www.liaoxuefeng.com/wiki/001374738 ...
- python web -- flask
Flask是一个简洁的 Python_web 框架. 零. virtualenv 虚拟环境配置. $ easy_install pip $ pip install virtualenv $ virtu ...
- QQ第三方登录-python_web开发_django框架
准备工作 1. 成为QQ互联的开发者 参考链接: <http://wiki.connect.qq.com/%E6%88%90%E4%B8%BA%E5%BC%80%E5%8F%91%E8%80%8 ...
- 整合django和bootstrap框架
环境: python版本:2.7.8 django版本:1.7.1 bootstrap版本:3.3.0 首先github上面有两个开源的项目用来整合django和bootstrap. https:// ...
- python_web应用雏型
python_web应用雏型 Web应用程序顾名思义,就是一种可以通过Web访问的应用程序, Web应用的最大特点是用户只需要有网络和浏览器,不需要再安装其他软件就可顺利通过web访问到程序. WEB ...
- DRF框架之DRF的引入
DRF框架是python_web中采用前后端分离开发模式的框架,其处理JSON数据是最快的. 通过DRF框架,我们后端程序员只需要拼接并响应JSON数据即可,并且数据复用性高适用于浏览器端.APP端等 ...
- python pytest接口自动化框架搭建(一)
1.首先安装pytest pip install pytest 2.编写单测用例 在pytest框架中,有如下约束: 所有的单测文件名都需要满足test_*.py格式或*_test.py格式. 在单测 ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
随机推荐
- 【一本通1329:【例8.2】细胞&&洛谷P1451 求细胞数量】
1329:[例8.2]细胞 [题目描述] 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.如: 阵列 4 10 023 ...
- JS绑定带参数的事件总要执行一次方法,如何避免?
类似这样:function aa(vote){alert(vote);}$(".btnn").bind("click",aa(1)});没有点击就开始执行了.怎 ...
- java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"报错
出现问题的原因: 内存用户验证时,Spring boot 2.0.1引用的security 依赖是 spring security 5.X版本,此版本需要提供一个PasswordEncorder的实例 ...
- 对filter的初步认识
Filter 技术是servlet 2.3 新增加的功能.servlet2.3是sun公司 于2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则.在 ...
- linux批量压缩当前目录中文件后,删除原文件
linux批量压缩当前目录中文件后,删除原文件 for i in `ls|awk -F " " '{print $NF}'`; do tar -zcvf $i.tar.gz $i ...
- Java 集合系列之二:List基本操作
1. Java List 1. Java List重要观点 Java List接口是Java Collections Framework的成员. List允许您添加重复元素. List允许您拥有'nu ...
- Redis实战阅读笔记——第二章(redis重构web)
在性能的要求下,如何用redis重构已有的已有的部分,其实整个例子背后的思路挺好的.在应用缓存的过程中,还有一指标个需要考虑,读写比.
- python 去除html 超链接href 如何实现?
今天持久男 在抓取数据的时候发现很多内容都加了锚文本, 这怎么办呢? 没办法只能通过工具解决 我是这样解决的: 例如: soup = BeautifulSoup('<p>Hello < ...
- Python 变量作用域,闭包和装饰器
from dis import dis b = 6 def f1(a): print(a)print(b) b = 9 f1(3) print(dis(f1)) # dis模块可以查看python函数 ...
- Git管理源代码
Git Git 是目前世界上最先进的分布式版本控制系统(没有之一) 作用 源代码管理 为什么要进行源代码管理? 方便多人协同开发 方便版本控制 Git单人本地仓库操作 安装git sudo apt-g ...