浅谈 Web框架
一、Web框架本质
所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端
二、Web框架功能
socket收发消息 —— wsgiref(测试)、uwsgi(线上)
根据不同的路径返回不同的字符串
返回动态页面(字符串的替换)—— jinja2
三、Web框架种类
django
根据不同的路径返回不同的字符串
返回动态页面(字符串的替换)
flask
根据不同的路径返回不同的字符串
tornado
socket收发消息
根据不同的路径返回不同的字符串
返回动态页面(字符串的替换)
四、自定义web框架
简单示例:socket服务端
import socket
# 创建一个socket对象
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8000))
# 监听
sk.listen(5)
# 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data= conn.recv(1024)
print(data)
# 返回数据
conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>ok!</h1>')
# 断开连接
conn.close()根据不同路径返回不同的内容(普通版)
import socket
# 创建一个socket对象
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8000))
# 监听
sk.listen(5)
# 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
data = data.decode('utf-8')
url = data.split()[1]
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
if url == '/index/':
# 返回数据
conn.send(b'<h1>index!</h1>')
elif url == '/home/':
conn.send(b'<h1>home!</h1>')
else:
conn.send(b'<h1>404 not found!</h1>')
# 断开连接
conn.close()普通版
import socket
# 创建一个socket对象
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8000))
# 监听
sk.listen(5)
# 函数
def index(url):
ret = '<h1>index!</h1>({})'.format(url)
return ret.encode('utf-8')
def home(url):
ret = '<h1>home!</h1>({})'.format(url)
return ret.encode('utf-8')
# 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
data = data.decode('utf-8')
url = data.split()[1]
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
if url == '/index/':
# 返回数据
ret = index(url)
elif url == '/home/':
ret = home(url)
else:
ret = b'<h1>404 not found!</h1>'
conn.send(ret)
# 断开连接
conn.close()函数版
import socket
# 创建一个socket对象
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8000))
# 监听
sk.listen(5)
# 函数
def index(url):
ret = '<h1>index!</h1>({})'.format(url)
return ret.encode('utf-8')
def home(url):
ret = '<h1>home!</h1>({})'.format(url)
return ret.encode('utf-8')
# 定义一个list1和实际要执行的函数的对应关系
list1 = [
('/index/', index),
('/home/', home),
]
# 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
data = data.decode('utf-8')
url = data.split()[1]
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
func = None
for i in list1:
if url == i[0]:
func = i[1]
break
if func:
ret = func(url)
else:
ret = b'<h1>404 not found!</h1>'
conn.send(ret)
# 断开连接
conn.close()函数进阶版
import socket
# 创建一个socket对象
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8000))
# 监听
sk.listen(5)
# 函数
def index(url):
with open('index.html','rb') as f:
ret = f.read()
return ret
def home(url):
ret = '<h1>home!</h1>({})'.format(url)
return ret.encode('utf-8')
# 定义一个list1和实际要执行的函数的对应关系
list1 = [
('/index/', index),
('/home/', home),
]
# 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
data = data.decode('utf-8')
url = data.split()[1]
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
func = None
for i in list1:
if url == i[0]:
func = i[1]
break
if func:
ret = func(url)
else:
ret = b'<h1>404 not found!</h1>'
conn.send(ret)
# 断开连接
conn.close()返回html页面
import socket
import time
# 创建一个socket对象
sk = socket.socket()
# 绑定IP和端口
sk.bind(('127.0.0.1', 8000))
# 监听
sk.listen(5)
# 函数
def index(url):
with open('index.html', 'rb') as f:
ret = f.read()
return ret
def home(url):
ret = '<h1>home!</h1>({})'.format(url)
return ret.encode('utf-8')
def timer(url):
now = time.strftime('%H:%M:%S')
with open('time.html','r',encoding='utf-8') as f:
data = f.read()
data = data.replace('xxtimexx',now)
return data.encode('utf-8')
# 定义一个list1和实际要执行的函数的对应关系
list1 = [
('/index/', index),
('/home/', home),
('/time/', timer),
]
# 等待连接
while True:
conn, addr = sk.accept()
# 接收数据
data = conn.recv(1024)
data = data.decode('utf-8')
url = data.split()[1]
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
func = None
for i in list1:
if url == i[0]:
func = i[1]
break
if func:
ret = func(url)
else:
ret = b'<h1>404 not found!</h1>'
conn.send(ret)
# 断开连接
conn.close()
补充:time.html <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>当前时间是:@@time@@</h1>
</body>
</html>返回动态页面
五、wsgiref
常用的WSGI服务器有uWSGI、Gunicorn
Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器
简单示例:
"""
根据URL中不同的路径返回不同的内容--函数进阶版
返回HTML页面
让网页动态起来
wsgiref模块版
"""
from wsgiref.simple_server import make_server # 将返回不同的内容部分封装成函数
def index(url):
# 读取index.html页面的内容
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
# 返回字节数据
return bytes(s, encoding="utf8") def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8") def timer(url):
import time
with open("time.html", "r", encoding="utf8") as f:
s = f.read()
s = s.replace('@@time@@', time.strftime("%Y-%m-%d %H:%M:%S"))
return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系
list1 = [
("/index/", index),
("/home/", home),
("/time/", timer),
] def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
func = None
for i in list1:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
return [response, ] if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8090, run_server)
print("我在8090等你哦...")
httpd.serve_forever()示例
六、jinja2
模板渲染现成的工具:jinja2
下载jinja2:pip install jinja2
示例:
from wsgiref.simple_server import make_server
from jinja2 import Template def index(url):
# 读取HTML文件内容
with open("index2.html", "r", encoding="utf8") as f:
data = f.read()
template = Template(data) # 生成模板文件
ret = template.render({'name': 'alex', 'hobby_list': ['抽烟', '喝酒', '烫头']}) # 把数据填充到模板中
return bytes(ret, encoding="utf8") def home(url):
with open("home.html", "r", encoding="utf8") as f:
s = f.read()
return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系
list1 = [
("/index/", index),
("/home/", home),
] def run_server(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html;charset=utf8'), ]) # 设置HTTP响应的状态码和头信息
url = environ['PATH_INFO'] # 取到用户输入的url
func = None
for i in list1:
if i[0] == url:
func = i[1]
break
if func:
response = func(url)
else:
response = b"404 not found!"
return [response, ] if __name__ == '__main__':
httpd = make_server('127.0.0.1', 8090, run_server)
print("我在8090等你哦...")
httpd.serve_forever()<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<h1>姓名:{{name}}</h1>
<h1>爱好:</h1>
<ul>
{% for hobby in hobby_list %}
<li>{{hobby}}</li>
{% endfor %}
</ul>
</body>
</html>index2.html
浅谈 Web框架的更多相关文章
- 【架构】浅谈web网站架构演变过程
浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管 ...
- [原创]浅谈Web UI自动化测试
[原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...
- 浅谈web应用的负载均衡、集群、高可用(HA)解决方案(转)
1.熟悉几个组件 1.1.apache —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安 ...
- 浅谈|WEB 服务器 -- Caddy
浅谈|WEB 服务器 -- Caddy 2018年03月28日 12:38:00 yori_chen 阅读数:1490 标签: caddyserverwebhttps反向代理 更多 个人分类: ser ...
- 手撸ORM浅谈ORM框架之基础篇
好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...
- 手撸ORM浅谈ORM框架之Add篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Update篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Delete篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Query篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
随机推荐
- Flutter学习笔记(1)--环境安装
flutter最近显得格外的火,公司的同事也一直在谈论flutter,感觉自己不学学就要失业了...所以决定顺应潮流学习以下flutter,做一下学习笔记,希望可以给需要的同学带来一些帮助~ 正文为f ...
- 030.[转] sql事务特性
sql事务特性简介 pphh发布于2018年10月5日 Sql事务有原子性.一致性.隔离性.持久性四个基本特性,要实现完全的ACID事务,是以牺牲事务的吞吐性能作为代价的.在有些应用场景中,通过分析业 ...
- vue中点击按钮复制内容
<el-button type="primary" round size="mini" @click="copyUrl">复制u ...
- [20190524]DISABLE TABLE LOCK(12c).txt
[20190524]DISABLE TABLE LOCK(12c).txt --//如果禁止table lock时,一些ddl操作会被禁止.但是我有点吃惊的是增加字段不受限制.--//链接:http: ...
- bayaim_hadoop 开篇 0.0
------------------bayaim_hadoop 开篇 0.0 -----2018年11月19日09:21:46--------------------------------- 前言: ...
- [Go] gocron源码阅读-flag包实现命令行参数获取
调用flag包可以方便的获取到命令行中传递的参数,比如可以实现类似nginx执行程序获取命令行参数执行不同操作的目标 package main import ( "flag" &q ...
- centos7中启动tomcat提示bash: tomcat8.0.39/bin/startup.sh: 权限不够
问题描述: centos7中启动tomcat提示bash: tomcat8.0.39/bin/startup.sh: 权限不够 解决方案:先进入bin目录 [root@localhost/]# cd ...
- AtCoder - 2286 (数论——唯一分解定理)
题意 求n!的因子数%1e9+7. 思路 由唯一分解定理,一个数可以拆成素数幂之积,即2^a * 3^b *……,n!=2*3*……*n,所以计算每个素因子在这些数中出现的总次数(直接对2~n素因子分 ...
- linux学习(二)linux系统的安装
Linux 安装 本章节我们将为大家介绍 Linux 的安装,安装步骤比较繁琐,现在其实云服务器挺普遍的,价格也便宜,如果直接不想搭建,也可以直接买一台学习用用,参考各大云服务器比较. 本章节以 ce ...
- tensorboard运行使用(排坑)记录一
首先运行如下代码(路径根据你自己的要求更改) writer = tf.summary.FileWriter("G:/tensorflow/graph", tf.get_defaul ...