浅谈 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 ...
随机推荐
- C和C++中的struct的不同
C和C++中的struct的不同: (1)定义变量: C语言中: struct stu { ...... }; struct stu student; C++语言中: struct stu { . ...
- .Net Core使用Swagger来对接口文档化
参考文档来源:https://www.cnblogs.com/yilezhu/p/9241261.html 官方地址 https://swagger.io/ 代码即接口文档,接口文档即代码 使用.ne ...
- 使用Azure进行自动化机器学习
什么是自动化机器学习? 自动化的机器学习,也称为 AutoML,让数据科研人员. 分析人员和开发人员,同时维护模型质量构建具有高缩放性. 效率和工作效率的机器学习模型. 自动化机器学习生成的机器学习模 ...
- vue项目关闭eslint校验
[前言] eslint是一个JavaScript的校验插件,通常用来校验语法或代码的书写风格.这篇文章主要介绍了vue项目关闭eslint校验,需要的朋友可以参考下 [主体] 简介eslint esl ...
- 6.gitlab 备份
在配置文件有有默认的 备份路劲 sudo vim /etc/gitlab/gitlab.rb 默认在这个 路径下面 /var/opt/gitlab/backups 然后默认的备份时间是 7天 , ...
- day80_10_29git冲突解决与短信服务redis
一.开发中的操作. 在项目开发中,在工作区进行开发,开发结束后提交到本地版本库. 再拉取远程仓库,具体如下: """ 1.开发前,拉一次远程仓库 2.工作区进行开发 3. ...
- selenium中driver.close()和driver.quit()的不同点
driver.quit()与driver.close()的不同:driver.quit(): Quit this driver, closing every associated windows;dr ...
- luoguP5283 [十二省联考2019]异或粽子
题意 类似超级钢琴,找最优解用可持久化trie. code: #include<bits/stdc++.h> using namespace std; #define re registe ...
- React内容
React Fiber 16版本 registerServiceWorker 的作用 PWA progressive web application 写手机app应用 在断网的情况下,第二 ...
- Mondb
1. MongoDB简介 • MongoDB是为快速开发互联网Web应用而设计的数据库系统.• MongoDB的设计目标是极简.灵活.作为Web应用栈的一部分.• MongoDB的数据模型是面向文档的 ...