web框架—自建简易框架

1、基本的bs架构

'''
1、本地客户端都能访问
2、由客户端发来的数据,可查看当客户端为浏览器时的数据格式,即HTTP协议规定的数据格式
'''
import socket

sk = socket.socket()
sk.bind(("127.0.0.1", 80))
sk.listen()

while True:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    print(data)  # 得到客户端发来的数据
    
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 按照HTTP协议发送响应头
    conn.send(b"OK")  # 统一响应OK
    conn.close()

2、响应不同请求

'''
1、客户端请求的不同,体现在url上的不同
2、从服务端分析客户端的请求数据,发现请求url在整个字串中的相同位置:HTTP之前,GET之后
3、可以使用切分字符串的方式,拿到该url,从而对它做逻辑处理,返回不同的内容给客户端
'''
import socket, time

sk = socket.socket()
sk.bind(("127.0.0.1", 80))
sk.listen()


def login():
    return 'login'


def error():
    return '404'


def index():  # 刷新即可看到最新时间,模拟动态显示数据
    with open("index.html", "r", encoding="utf8") as f:
        s = f.read()
        now = str(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()))
        s = s.replace("@@oo@@", now)
    return s


while True:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    print(data)  # 得到客户端发来的数据

    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')  # 按照HTTP协议发送响应头

    data = data.decode('utf8')
    url = data.split(' ')[1]
    if url == '/login':
        res = login()
    elif url == '/index':
        res = index()
    else:
        res = error()
    print(res)
    conn.send(res.encode('utf8'))  # 统一编码成bytes
    conn.close()

3、封装socket连接:模块wsgiref

上述代码的缺点:

1、每一个服务端都要写socket连接

2、每一个服务端都要写请求头

3、不同请求的函数都在一个页面

4、手动实现动态效果,代码复杂

基于此,基于同一接口、封装的思想

1、有了封装好socket连接的模块wsgiref

2、有了专门存放所有html文件的文件夹

3、有了专门存放url与响应函数对应关系的urls.py文件

4、有了专门存放处理请求的响应函数的views.py文件

5、有了专门做动态渲染的模块jinjia2

3.1 模块介绍

# wsgiref
# 用法:
from wsgiref.simple_server import make_server
def run_server(environ, start_response):
 	'''
 	environ:客户端发来的请求数据
 	'''
	start_response('200 OK', [('', ''), ])  # 设置HTTP响应状态,第二个参数,请看源码
	
    '''
	逻辑代码
	'''
    
    
if __name__ == '__main__':
    httpd = make_server('', 8000, run_server)  # 绑定ip,
    print("Serving HTTP on port 8000...")
    httpd.serve_forever()
# jinjia2
# 用法:
from jinja2 import Template

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

posted @ 2019-11-21 22:59  W文敏W  阅读(239)  评论(0)    收藏  举报