【补充】纯手撸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)
posted @ 2023-07-07 09:49  Chimengmeng  阅读(11)  评论(0编辑  收藏  举报
/* */