【补充】纯手撸Web框架
纯手撸Web框架
【1.0】简易版本
python
# -*-coding: Utf-8 -*-
# @File : 01 纯手撸web框架 .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/6
# 可以将web框架看成一个服务端
from socket import *
server = socket()
# TCP 三次握手 四次挥手
server.bind(('127.0.0.1', 8083))
# IP协议/以太网协议/arp协议
server.listen(5)
# 池的概念
while True:
# 接受客户端连接对象
conn, addr = server.accept()
# 接收到客户端发送的数据
data_from_client = conn.recv(1024)
# 接收到客户端发送的数据 并转码
data_from_client = data_from_client.decode('utf8')
# 向客户端反馈信息已收到
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
# 获取当前访问的页面请求头路径
current_path = data_from_client.split(' ')[1]
# 对访问路径做判断,不同的路径返回不同的信息
if current_path == "index":
with open("myhtml.html", 'rb') as f:
conn.send(f.read())
elif current_path == "login":
conn.send(b"Welcome to login!")
else:
conn.send(b'welcome! Please!')
conn.close()
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>这是一个一级标题!</h1>
</body>
</html>
【分析】
- 服务端代码重复(服务端代码所有人都要重写)
- 手动处理http格式的数据,并且只能拿到url的后缀
- 其他数据获取繁琐(数据格式一样代码其实大概一样 重复写)
- 无法实现并发
【2.0】借助 wsgiref
# -*-coding: Utf-8 -*-
# @File : 02 基于wsgrief .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/6
from wsgiref.simple_server import make_server
def main(env, response):
'''
:param env: 请求相关的所有数据
:param response: 相应相关的所有数据
:return: 返回给浏览器的数据
'''
print(env)
# wsgiref 自动处理传进来的数据,封装成字典,更加方便操作
# 从env中取到请求地址
current_path = env.get('PATH_INFO')
response('200 OK', [])
if current_path == "/index":
return [b'index']
elif current_path == "/login":
return [b'login']
else:
return [b'404 error']
if __name__ == '__main__':
ip = '127.0.0.1'
port = 8080
server = make_server(ip, port, main)
# 实时监听 ip:port 地址,只要有人访问就会触发run函数运行
server.serve_forever()
【3.0】面条版
# -*-coding: Utf-8 -*-
# @File : 02 基于wsgrief .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/6
from wsgiref.simple_server import make_server
def index(env):
return 'index'
def login(env):
return 'login'
def register(env):
return 'register'
def error(env):
return '404 error'
urls = [
("/index", index),
("/login", login),
("/register", register),
]
def main(env, response):
'''
:param env: 请求相关的所有数据
:param response: 相应相关的所有数据
:return: 返回给浏览器的数据
'''
response('200 OK', [])
# wsgiref 自动处理传进来的数据,封装成字典,更加方便操作
# 从env中取到请求地址
current_path = env.get('PATH_INFO')
# 定义一个变量存储匹配到的函数名
func = None
for url in urls:
if current_path == url[0]:
func = url[1]
# 匹配正确后,结束当前循环
break
# 判断 func 是否有值
if func:
# 匹配成功执行方法
res = func(env)
else:
# 匹配失败返回 失败页面
res = error(env)
return [res.encode('utf8')]
if __name__ == '__main__':
ip = '127.0.0.1'
port = 8080
server = make_server(ip, port, main)
# 实时监听 ip:port 地址,只要有人访问就会触发run函数运行
server.serve_forever()
【4.0】分层架构
【1】架构
- urls.py
- 路由与视图函数对应关系
- views
- 视图函数(主要的后端业务逻辑)
- templates
- 专门用来存储 html 文件
【2】文件
- main
# -*-coding: Utf-8 -*-
# @File : 02 基于wsgrief .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/6
from wsgiref.simple_server import make_server
from urls import urls_list
from views import *
def main(env, response):
'''
:param env: 请求相关的所有数据
:param response: 相应相关的所有数据
:return: 返回给浏览器的数据
'''
response('200 OK', [])
# wsgiref 自动处理传进来的数据,封装成字典,更加方便操作
# 从env中取到请求地址
current_path = env.get('PATH_INFO')
# 定义一个变量存储匹配到的函数名
func = None
for url in urls_list:
if current_path == url[0]:
func = url[1]
# 匹配正确后,结束当前循环
break
# 判断 func 是否有值
if func:
# 匹配成功执行方法
res = func(env)
else:
# 匹配失败返回 失败页面
res = error(env)
return [res.encode('utf8')]
if __name__ == '__main__':
ip = '127.0.0.1'
port = 8080
server = make_server(ip, port, main)
# 实时监听 ip:port 地址,只要有人访问就会触发run函数运行
server.serve_forever()
- urls
# -*-coding: Utf-8 -*-
# @File : urls .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/7
from views import *
urls_list = [
("/index", index),
("/login", login),
("/register", register),
("/xxx", xxx),
]
- views
# -*-coding: Utf-8 -*-
# @File : views .py
# author: Chimengmeng
# blog_url : https://www.cnblogs.com/dream-ze/
# Time:2023/7/7
import os, sys
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
templates_path = os.path.join(BASE_DIR, 'templates')
def index(env):
return 'index'
def login(env):
return 'login'
def register(env):
return 'register'
def error(env):
return '404 error'
def xxx(env):
file_path = os.path.join(templates_path, 'myxxx.html')
with open(file_path, 'r', encoding='utf8') as f:
return f.read()
if __name__ == '__main__':
file_path = os.path.join(templates_path, 'myxxx.html')
print(file_path)
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17533982.html