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()