web框架初识

web框架的本质

所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,我们就可以自己实现Web框架了。

简单的web框架编写

简单的web框架(返回HTMl页面)

import socket
server = socket.socket()
server.bind(('127.0.0.1', 8896))
server.listen(5)
while 1:
    # HTTP请求是一次请求一次响应,在返回数据之后,关闭链接就可以了
    conn, addr = server.accept()
    from_client_data = conn.recv(1024)
    # 获取浏览器访问的路径
    path = from_client_data.decode('utf8').split()[1]
    # 按照HTTP协议规定的方式返回消息
    conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
    # '/'代表的是根路径,就是IP地址后面没有写访问路径
    if path == '/':
        # 打开html文件,以rb的形式读取出来
        with open('test.html', 'rb')as f:
            # 读取的html文件
            data = f.read()
    # 如果访问的是CSS文件路径,将CSS文件读取出来
    elif path == '/style.css':
        with open('style.css', 'rb')as f:
            data = f.read()
    # 如果访问的是JS文件,将js的文件读取出来
    elif path == '/test.js':
        with open('test.js', 'rb')as f:
            data = f.read()
	#将获取的文件发送给客户端
    conn.send(data)
    conn.close()
'''
1:通过浏览器访问上面socket代码中设置的IP地址和端口就能获取到HTML页面的内容
2:我们的css,js代码单独写在一个文件中的,当我们吧HTMl页面发送给浏览器的时候,浏览器对HTML页面进行渲染,渲染的时候读取HTMl中有导入的css文件和JS文件,就会再次向server端发送请求
'''

多线程动态返回HTMl页面

import socket, time
from threading import Thread

# 客户端通过根路径访问时,服务端返回HTML页面
def home(conn):
    with open('test.html', 'r', encoding='utf-8')as f:
        new = str(time.time())
        s = f.read()
        #将获取的动态时间替换掉HTML页面中的时间,达到动态返回页面的效果
        s = s.replace('$$xx$$', new)
        conn.send(s.encode('utf-8'))
        conn.close()

# 当客户端通过CSS路径访问的时候,服务端返回CSS文件
def style(conn):
    with open('style.css', 'rb')as f:
        conn.send(f.read())
        conn.close()

# 当客户端通过JS路径访问的时候,服务端返回CSS文件
def index(conn):
    with open('test.js', 'rb')as f:
        conn.send(f.read())
        conn.close()

# 当客户端通过请求索要图片的时候,服务端返回图片
def png(conn):
    with open('1.png','rb')as f:
        conn.send(f.read())
        conn.close()

# 当客户端发送请求索要,ico文件的时候,返回ioc文件
def ico(conn):
    with open('wechat.ico','rb')as f:
        print('333')
        conn.send(f.read())
        conn.close()

def ind(conn):
    with open('index.html','rb')as f:
        print('333')
        conn.send(f.read())
        conn.close()


#定义一个路径和文件的对应列表,节省代码,
urlList=[(b'/',home),(b'/style.css',style),(b'/test.js',index),(b'/wechat.ico',ico),(b'/index',ind)]

while 1:
    server = socket.socket()
    server.bind(('127.0.0.1',8896))
    server.listen(5)
    conn,addr=server.accept()
    #获取请求路径
    path=conn.recv(1024).split()[1]
    print(path)
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    func=None
    for url in urlList:
        if path==url[0]:
            p=Thread(target=url[1],args=(conn,))
            p.start()

posted @ 2019-10-04 15:08  luckinlee  阅读(189)  评论(0编辑  收藏  举报