web框架的本质就是一个socket服务端,而浏览器就是一个socker客户端,基于请求做出相应,客户端先请求,服务器做出对应响应
按照http协议的请求发送,服务器按照http协议来相应,这样的通信就可以自己实现web框架了
简单web框架
import socket server = socket.socket() server.bind((‘127.0.0.1‘, 8080)) # 把地址绑到套接字 server.listen() # 监听链接 while 1: conn, addr = server.accept() # 接受客户端连接 from_b_msg = conn.recv(1024).decode(‘utf-8‘) # 接收客户端信息 print(from_b_msg) path = from_b_msg.split(‘\r\n‘)[0].split()[1] # 赛选到客户端的第一行信息 conn.send(b‘HTTP/1.1 200 ok\r\n\r\n‘) # http响应格式 1.状态行 回车符 换行符 2.相应头部头部字段:值 回车符 换行符 回车符 换行符响应正文 # conn.send(b‘hello‘) if path == ‘/‘: # 只写这一个 你会发现 该 网页css js 应用都没应用上 因为他们 请求/test.css /timg.jpg with open(‘test.html‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() elif path == ‘/test.css‘: with open(‘test.css‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() elif path == ‘/timg.jpg‘: with open(‘timg.jpg‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() elif path == ‘/test.js‘: with open(‘test.js‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() elif path == ‘/meinv.ico‘: with open(‘meinv.ico‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close()
test.html
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --> <title>Bootstrap 101 Template</title> <link rel="stylesheet" href="test.css"> <link rel="icon" href="meinv.ico"> <!-- Bootstrap --> <!--<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet">--> <style> </style> </head> <body> <h1>来首诗,菩提本无树,明镜亦非台</h1> <!--<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1550637152712&di=1caeff14731881d6d2ad4d9681ad031a&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F0b55b319ebc4b7454d716709c5fc1e178b8215c3.jpg" >--> <img src="timg.jpg" alt=""> <!--<script src="jquery.js"></script>--> <!--<script src="bootstrap/js/bootstrap.min.js"></script>--> <!--<script>--> <!--alert(‘xxx‘);--> <!--</script>--> <script src="test.js"></script> </body> </html>
test.css
h1{ background-color: green; } img{ width: 200px; height: 200px; }
test.js
alert(‘xxx‘);
这2个图片 我就不提供了
timg.jpg
meinv.ico
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)
HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。
工作原理
1.客户端到连接服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接:如http://www.baidu.com
2.发送http请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

URL包含:/index/index2?a=1&b=2;路径和参数都在这里。

3.服务接收请求并返回http响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。


4.释放连接tcp连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5.客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
只加根判断应答会出现 下面情况

高级点的 web框架
from threading import Thread import socket server = socket.socket() server.bind((‘127.0.0.1‘, 8080)) server.listen() def html(conn): with open(‘test.html‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() def js(conn): with open(‘test.js‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() def css(conn): with open(‘test.css‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() def img(conn): with open(‘timg.jpg‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() def ico(conn): with open(‘meinv.ico‘, ‘rb‘) as f: data = f.read() conn.send(data) conn.close() url = [ (‘/‘, html), (‘/test.css‘, css), (‘/timg.jpg‘, img), (‘/test.js‘, js), (‘/meinv.ico‘, ico), ] while 1: conn, addr = server.accept() from_b_msg = conn.recv(1024).decode(‘utf-8‘) path = from_b_msg.split(‘\r\n‘)[0].split(‘ ‘)[1] conn.send(b‘HTTP/1.1 200 ok\r\nk1:v1\r\n\r\n‘) for i in url: if i[0] == path: t=Thread(target=i[1],args=(conn,)) t.start()
原文:https://www.cnblogs.com/zaizai1573/p/10408199.html