思考: WEB框架原理是什么?设计模式是什么?
这样,我们就可以自己实现一个简单的Web应用框架示例。
服务端程序示例:
import socket sk = socket.socket() sk.bind(("127.0.0.1", 8080)) sk.listen() while 1: conn, addr = sk.accept() data = conn.recv(8096) print(data) # 将浏览器发来的消息打印出来 conn.send(b"OK") conn.close()
浏览器地址栏输入:
https://127.0.0.1:8080
服务端接收结果:
b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nDNT: 1\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: csrftoken=RKBXh1d3M97iz03Rpbojx1bR6mhHudhyX5PszUxxG3bOEwh1lxFpGOgWN93ZH3zv\r\n\r\n'
浏览器接收结果:
显示"OK"
我们发现服务端接收到的结果以"\r\n"作为换行符,可以解析出一个固定的格式。这个可以解析出的固定格式就是网络通信中客户端与服务端通信的规则。这个规则就是HTTP协议,不管是浏览器发送请求(request)信息也好,还是服务器回复响应(response)信息也罢,都要按照这个规则来。
HTTP协议主要规定了客户端和服务器之间的通信格式,那HTTP协议是怎么规定消息格式的呢?
每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。 HTTP响应的Header中有一个 Content-Type
表明响应的内容格式。如 text/html
表示HTML网页。
1.2.1 HTTP请求格式
1.2.2 HTTP响应格式
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址即url中,以http://www.luffycity.com:80/news/index.html?id=250&page=1 为例:
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
虽然 RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
以下是 HTTP 请求/响应的步骤:
1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com。
2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5. 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
- 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
- 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
- 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
- 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
- 释放 TCP连接;
- 浏览器将该 html 文本进行解析并显示内容;
主要有以下四个版本
HTTPS 协议是由 HTTP 加上 TLS/SSL (即HTTP + SSL / TLS)协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。
服务器端程序:
""" 使用socket 搭建一个简单的web服务端 使用函数接收访问的网页并返回响应的结果 """ import socket sk = socket.socket() sk.bind(('127.0.0.1', 8080)) sk.listen() def login(url): data = 'ni fang wen de shi: {}'.format(url) return bytes(data, encoding='utf8') def admin(url): data = 'ni fang wen de shi: {}'.format(url) return bytes(data, encoding='utf8') # url和函数的对应关系 url_func = [ ('/login/', login), ('/admin/', admin), ] while 1: # ------------------- 建立连接 接收消息部分 -------------------- conn, addr = sk.accept() data = conn.recv(9000) # -------------------- 对用户发来的消息做处理的部分 ------------- # 把收到的字节类型的数据转换成字符串 data_str = str(data, encoding='utf8') # 按照课前练习切分字符串,得到请求行 first_line = data_str.split('\r\n')[0] # 对请求行按照空格切割 url = first_line.split(' ')[1] # --------------- 业务逻辑处理部分 --------------------- # 使用func变量保存将要执行的函数 for i in url_func: if i[0] == url: func = i[1] break else: func = None # 执行函数 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()
运行服务器端程序后,在浏览器地址栏输入:
127.0.0.1:8080/login/
浏览器运行结果根据输入地址的不同而不同:
通过以上自我改进,我们把可以总结出web框架主要有的三个工作,可分为两种程序:
web服务程序:
web应用程序:
web服务程序和web应用程序间通信: 用WSGI协议
自己实现abc的:例如tornado tornado并发做的好可以用于爬虫
自己实现b,c 用别人a 例如Django
自己实现C 使用别人的a和b: 例如Flask Flask小而美
1.Django:Django框架是一个大而全的框架
2.其他 :tornado Flask bottle
MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。
MVC:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
两种模式的区别与联系进一步学习:点击
点击 1(https://zhidao.baidu.com/question/584804822.html)
点击 2(https://blog.csdn.net/qq_38461232/article/details/91127424)