web框架的本质及自定义web框架

web框架

简单版回复页面框架

import socket
server = socket.socket()
server.bind(('127.0.0.1',8001))
# 127.0.0.1:8001
server.listen()
while 1:
    conn,addr = server.accept()
    from_brower_msg = conn.recv(1024)
    # print(from_brower_msg)
    path = from_brower_msg.decode('utf-8').split(' ')[1]
    print(path)
    conn.send(b'HTTP/1.1 200 ok

')
    if path == '/':
        with open('04test.html','rb') as f:
            data = f.read()
    elif path == '/style.css':
        with open('style.css', 'rb') as f:
            data = f.read()
    elif path == '/test.js':
        with open('test.js', 'rb') as f:
            data = f.read()
    elif path == '/1.jpg':
        with open('1.jpg', 'rb') as f:
            data = f.read()
    conn.send(data)
    conn.close()

进阶函数版框架+多线程web框架

import socket
from urls import urlpatterns
from threading import Thread
server = socket.socket()
server.bind(('127.0.0.1',8003))
# 127.0.0.1:8001
server.listen()
while 1:
    conn,addr = server.accept()
    from_brower_msg = conn.recv(1024)
    # print(from_brower_msg)
    path = from_brower_msg.decode('utf-8').split(' ')[1]
    print(path)
    conn.send(b'HTTP/1.1 200 ok

')
    for url in urlpatterns:
        if path == url[0]:
            # ret = url[1]()
            t = Thread(target=url[1],args=(conn,))
            t.start()
            break
    # else:
    #     t = Thread(target=nofount,args=(conn,))
    #     t.start()
    # if path == '/':
    #     ret = home()
    #     # t = Thread(target=home,)
    #     # t.start()
    #
    # elif path == '/style.css':
    #     ret = css()
    #
    # elif path == '/test.js':
    #     ret = js()
    #
    # elif path == '/1.jpg':
    #     ret = pic()

动态页面的web框架

import socket
from urls import urlpatterns
from threading import Thread

server = socket.socket()

server.bind(('127.0.0.1',8003))
# 127.0.0.1:8001
server.listen()




while 1:

    conn,addr = server.accept()

    from_brower_msg = conn.recv(1024)
    # print(from_brower_msg)
    path = from_brower_msg.decode('utf-8').split(' ')[1]
    print(path)
    conn.send(b'HTTP/1.1 200 ok

')

    for url in urlpatterns:
        if path == url[0]:
            # ret = url[1]()
            t = Thread(target=url[1],args=(conn,))
            t.start()
            break

不同html页面web框架

import socket
from urls import urlpatterns
from threading import Thread

server = socket.socket()

server.bind(('127.0.0.1',8003))
# 127.0.0.1:8001
server.listen()



while 1:

    conn,addr = server.accept()

    from_brower_msg = conn.recv(1024)
    # print(from_brower_msg)
    path = from_brower_msg.decode('utf-8').split(' ')[1]
    print(path)
    conn.send(b'HTTP/1.1 200 ok

')

    for url in urlpatterns:
        if path == url[0]:
            # ret = url[1]()
            t = Thread(target=url[1],args=(conn,))
            t.start()
            break

wsgiref模块

from wsgiref.simple_server import make_server

from urls import urlpatterns

def application(environ,start_response):
    # environ  所有请求相关信息
    # start_response --封装响应数据格式

    print('当前请求路径',environ['PATH_INFO'])
    path = environ['PATH_INFO']
    start_response('200 ok',[]) # conn.send(b'HTTP/1.1 200 ok

')
    for url in urlpatterns:
        if path == url[0]:
            ret = url[1]()

    return [ret]


if __name__ == '__main__':
    h = make_server('127.0.0.1', 8080, application)
    h.serve_forever()




jinja2模块

<!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>
from wsgiref.simple_server import make_server
from jinja2 import Template


def index():
    with open("index2.html", "r",encoding='utf-8') as f:
        data = f.read()
    template = Template(data)  # 生成模板文件
    ret = template.render({"name": "于谦", "hobby_list": ["烫头", "泡吧"]})  # 把数据填充到模板里面
    return [bytes(ret, encoding="utf8"), ]


# 定义一个url和函数的对应关系
URL_LIST = [
    ("/index/", index),
]

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 URL_LIST:
        if i[0] == url:
            func = i[1]  # 去之前定义好的url列表里找url应该执行的函数
            break
    if func:  # 如果能找到要执行的函数
        return func()  # 返回函数的执行结果
    else:
        return [bytes("404没有该页面", encoding="utf8"), ]


if __name__ == '__main__':
    httpd = make_server('', 8000, run_server)
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()
原文地址:https://www.cnblogs.com/beichen123/p/11937218.html