2.Django(web框架的 简单版、升级版、函数进阶版、并发进阶版)
-
socket
import socket
server = socket.socket()
server.bind(('127.0.0.1',8001))
server.listen(5)
while 1:
conn,addr = server.accept()
from_client_data = conn.recv(1024)
print(from_client_data.decode('utf-8'))
# 浏览器与服务器之间的通信要遵循一个协议:http https协议
conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
with open('HTML页面.html',mode='rb') as f1:
conn.send(f1.read())
conn.close() -
html页面
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
⽤户名:<input type="text" name="username">
密码:<input type="text" name="password">
<input type="submit">
</form>
</body>
</html>
升级版web框架
我们的html是需要有css、js代码的,上⾯的没有这些内容
浏览器共发起了四次请求:
第⼀次请求,请求的是127.0.0.1:8001/ 根⽬录,服务器给其返回了⼀个html⻚⾯。
第⼆次请求:link主动发起的异步请求,请求127.0.0.1:8001/test2.css 等待服务端响应。
第三次请求:script主动发起的异步请求,请求127.0.0.1:8001/test2.js 服务端响应。
第四次请求:请求的是⽹⻚窗⼝前⾯的⼩图标请求127.0.0.1:8001/favicon.ico服务端响应
由于我们后端的逻辑有问题,你发送了四次请求,我们响应了四次 html⻚⾯。
我们的解决思路:针对不同的请求,返回不同的数据
-
scoket服务端
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8001))
server.listen(5)
while 1:
conn, addr = server.accept()
from_client_data = conn.recv(1024).decode('utf-8')
# print(from_client_data)
path = from_client_data.split('\r\n')[0].split()[1]
print(path)
if path == '/':
conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
with open('HTML页面.html', mode='rb') as f1:
conn.send(f1.read())
elif path == '/test2.css':
conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
with open('test2.css', mode='rb') as f1:
conn.send(f1.read())
elif path == '/test2.js':
conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
with open('test2.js', mode='rb') as f1:
conn.send(f1.read())
elif path == '/icon.png':
conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
with open('icon.png', mode='rb') as f1:
conn.send(f1.read())
conn.close()
-
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="test2.css">
<link rel="icon" href="icon.png">
</head>
<body>
<div><h1>欢迎来到皇家洗脚城</h1></div>
荣誉会员:
<ul>
<li>王砖家</li>
<li>⼤鸡哥</li>
<li>强哥</li>
</ul>
<script src="test2.js"></script>
</body>
</html>
函数进阶版web框架
-
socket
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8001))
server.listen(5)
def html(conn):
with open('升级版.html', mode='rb') as f1:
conn.send(f1.read())
def css(conn):
with open("test3.css", mode='rb') as f1:
conn.send(f1.read())
def js(conn):
with open("test3.js", mode='rb') as f1:
conn.send(f1.read())
def icon(conn):
# 图标只有第⼀次发送请求,当请求过后,再次请求 浏览器给我们缓存了。不会再发送请求了
with open('icon.png', mode='rb') as f1:
conn.send(f1.read())
url_list = [
('/', html),
('/test3.css', css),
('/test3.js', js),
('/icon.png', icon),
]
while 1:
conn, addr = server.accept()
from_client_data = conn.recv(1024).decode('utf-8')
path = from_client_data.split('\r\n')[0].split()[1]
'''
/
/test2.css
/test2.js
/icon.png
'''
conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
for url_tuple in url_list:
if url_tuple[0] == path:
url_tuple[1](conn)
break
conn.close()
-
html页面
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="test2.css">
<link rel="icon" href="icon.png">
</head>
<body>
<div><h1>欢迎来到皇家洗脚城</h1></div>
荣誉会员:
<ul>
<li>王砖家</li>
<li>⼤鸡哥</li>
<li>强哥</li>
</ul>
<script src="test2.js"></script>
</body>
</html>
并发进阶版web框架
函数进阶是在代码级别提升了,但是还是⼀个⼀个的穿⾏处理请求,第⼀个请求来了,剩下三个请求就等着,等第⼀个请求处理完了,关闭了链接,在处理第⼆个请求。不合理,并且极⼤地影响效率。
-
socket
import socket
from threading import Thread
server = socket.socket()
server.bind(('127.0.0.1', 8001))
server.listen(5)
def html(conn):
with open('升级版.html', mode='rb') as f1:
conn.send(f1.read())
conn.close()
def css(conn):
with open("test3.css", mode='rb') as f1:
conn.send(f1.read())
conn.close()
def js(conn):
with open("test3.js", mode='rb') as f1:
conn.send(f1.read()
conn.close()
def icon(conn):
with open("test3.js", mode='rb') as f1:
conn.send(f1.read())
conn.close()
with open('icon.png', mode='rb') as f1:
conn.send(f1.read())
url_list = [
('/', html),
('/test3.css', css),
('/test3.js', js),
('/icon.png', icon),
]
while 1:
conn, addr = server.accept()
from_client_data = conn.recv(1024).decode('utf-8')
# print(from_client_data)
path = from_client_data.split('\r\n')[0].split()[1]
print(path)
'''
/
/test2.css
/test2.js
/icon.png
'''
conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
for url_tuple in url_list:
if url_tuple[0] == path:
t = Thread(target=url_tuple[1],args=(conn,))
t.start()
-
html页面
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="test2.css">
<link rel="icon" href="icon.png">
</head>
<body>
<div><h1>欢迎来到皇家洗脚城</h1></div>
荣誉会员:
<ul>
<li>王砖家</li>
<li>⼤鸡哥</li>
<li>强哥</li>
</ul>
<script src="test2.js"></script>
</body>
</html>并发异步处理肯定⽐之前的串⾏处理效率⾼
-