在学习 Django 框架以前咱们得先了解 Web 框架的本质是什么, 以及 HTTP 协议的原理html
ps : B/S 的本质就是 C/Spython
全部的Web应用其实就是一个socket服务端, 而用户使用的浏览器就是一个socket客户端程序, 明白了Web矿建的本质, 咱们就能够实现本身的Web框架了web
import socket server = socket.socket() # 默认就是基于网络的TCP协议 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"ok") conn.close()
能够说Web服务的本质都是基于这简单的套接字程序扩展出来的浏览器
用户使用浏览器访问一台服务器, 输入网址, 向服务端发送数据, 那么这个数据发的是一些什么? 怎么发送? 若是每一个网站都有本身的要规则, 那整个互联网都乱套了, 用户访问不一样的网站就很繁琐缓存
因此, 就必须有一个统一的规则, 让你们发送数据或者接收数据的时候有一个依据; 而这个规则就是 HTTP 协议安全
HTTP协议既然规定了客户端和服务器之间的通讯格式,那HTTP协议是怎么规定消息格式的呢? 咱们先运行下上面写的 socket 将请求数据打印出来看看服务器
b'GET / HTTP/1.1\r\n ## 请求首行 Host: 127.0.0.1:8080\r\n ## 请求头 (下面都是,一大堆的K:V键值对) Connection: keep-alive\r\n Cache-Control: max-age=0\r\n Upgrade-Insecure-Requests: 1\r\n User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3823.400 QQBrowser/10.7.4307.400\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n Accept-Encoding: gzip, deflate, br\r\n Accept-Language: zh-CN,zh;q=0.9\r\n Cookie: csrftoken=WCzjKvmjOSdJbYKs0uIfPtiFfLl04FENb6p9CjypP7ZObcUpydaQPLZN0qPOVqwj\r\n \r\n' ## 换行 b'' ## 请求体
咱们在来访问一下博客园, 查看浏览器收到的相应数据 : 在网页中鼠标右击检查---->Network---->点击当前网页的网址---->Headers----->查看 Response Headers微信
经过socket服务端收到的请求以及图片中浏览器收到的响应能够发现收发消息都是按照必定的格式来的websocket
// 请求首行 : 请求方法, 协议版本... // 请求头 : 一大堆的 k:v 键值对 // 空行 \r\n : 用来标识做用 // 请求体 : 🔰并非全部的请求方法都有, 只要用来携带敏感性数据(get没有,post有)
1."get" 请求 : 朝服务端索要数据 (例 : 输入网址获取对应的内容) 2."post" 请求 : 朝服务端提交数据 (例 : 登入,输入用户名密码,提交到服务端进行校验)
1. 均可以携带额外的参数 : // GET 提交的数据会放在URL以后,以"?"分割URL和传输数据,参数之间以"&"相连 // POST方法是把提交的数据放在HTTP包的请求体(Body)中. 2. 提交的数据大小限制 : // 浏览器对URL长度有限制, 因此GET提交的数据大小有限制 // POST方法没有数据大小限制 3. 数据的安全性 : // GET方式提交数据, 会带来安全问题, 好比一个登陆页面, 经过GET方式提交数据时, 用户名和密码将出如今URL上 // 若是页面能够被缓存或者其余人能够访问这台机器, 就能够从历史记录得到该用户的帐号和密码
// 响应首行 : 响应状态码, 协议版本.... // 响应头 : 一大堆 k:v 键值对 // 空行 \r\n : 用来标识做用 // 响应体 : 响应正文, 展现给用户的数据
// 用简单的数字来表示一串中文意思(状态或者描述性信息) 1XX : 1开头的,服务端已经接受到你的数据正在处理,你能够继续提交 2XX : 200 OK>>> : 请求成功 3XX : 重定向(当你在访问一个须要登录以后才能看的页面你会发现会自动跳转到登录页面) 4XX : 403当前请求不符合条件(没有权限), 404请求资源不存在 5XX : 服务器内部错误,没法完成请求
ps : 除了上面提到的响应码以外, 公司内部还会自定义本身的状态码, 通常1000之后cookie
形式 : scheme:[//[user:password@]host[:port]][/]path[?query-string][#anchor]
提示 : 方框内的是可选部分
scheme :协议(例如:http, https, ftp)
user : password@用户的登陆名以及密码
host :服务器的IP地址或者域名
port :服务器的端口(若是是走协议默认端口,http 80 or https 443)
path :访问资源的路径
query-string :参数,它一般使用键值对来制定发送给http服务器的数据
anchor :锚(跳转到网页的指定锚点位置)