标签:web框架本质
根据之前学过的socket,我们可以理解所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。1、半成品自定义web框架
import socket
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.bind(("127.0.0.1", 80))
sk.listen()
while 1:
conn, addr = sk.accept() # 建立连接
data = conn.recv(8096) # 收发消息
print(data) # 将浏览器发来的消息打印出来
conn.send(b"welcome") # 回复消息
conn.close()
用户的浏览器一输入网址,会给服务端发送数据,那浏览器会发送什么数据?怎么发?这个谁来定?
这时候就有一个统一的规则,让大家发送消息、接收消息的时候有个格式依据,不能随便写。这个规则就是HTTP协议,以后浏览器发送请求信息也好,服务器回复响应信息也罢,都要按照这个规则来。
HTTP协议主要规定了客户端和服务器之间的通信格式,那HTTP协议是怎么规定消息格式的呢?看我们打印出来的data信息。
b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n\r\n'
2、×××版自定义web框架
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",8080))
server.listen(5)
while 1:
conn,addr=server.accept()
data=conn.recv(1024)
print(data)
conn.send(b"HTTP/1.1 200 OK\r\n\r\n") # 给回复的消息加上响应状态行
conn.send(b"welcome")
conn.close()
3、实现不同的路径返回不同的内容
3.1 最low版
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",8082))
server.listen(5)
while 1:
conn,addr = server.accept()
data = conn.recv(1024)
data_str = str(data,encoding="utf-8")
url = data_str.split("\r\n")[0].split()[1]
if url == '/index':
msg = b"This is index html"
elif url == '/home':
msg = b"This is home html"
else:
msg = b"404 Not Found!!!"
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
conn.send(msg)
conn.close()
3.2 函数版
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",8082))
server.listen(5)
def index(url):
return b"This is index html"
def home(url):
return b"This is home html"
while 1:
conn,addr = server.accept()
data = conn.recv(1024)
data_str = str(data,encoding="utf-8")
url = data_str.split("\r\n")[0].split()[1]
if url == '/index':
msg = index(url)
elif url == '/home':
msg = home(url)
else:
msg = b"404 Not Found!!!"
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
conn.send(msg)
conn.close()
3.3 函数进阶
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",8082))
server.listen(5)
def index(url):
return b"This is index html"
def home(url):
return b"This is home html"
url_list = [
("/index",index),
("/home",home),
] # 定义一个url和实际要执行的函数的对应关系
while 1:
conn,addr = server.accept()
data = conn.recv(1024)
data_str = str(data,encoding="utf-8")
url = data_str.split("\r\n")[0].split()[1]
func = None # 定义一个保存将要执行的函数名的变量
for i in url_list:
if i[0] == url:
func = i[1]
break
if func:
msg = func(url)
else:
msg = b"404 not found!"
conn.send(b"HTTP/1.1 200 OK\r\n\r\n")
conn.send(msg)
conn.close()
标签:web框架本质
原文地址:http://blog.51cto.com/10630401/2094637