【1】Web应用
- web应用基于B/S架构开发的应用。
- B/S -------- 浏览器/服务端
- B/S架构的本质是C/S架构,也就是客户端和服务端
- B/S架构的好处
- 软件更新只需在后端更新,在浏览器中不用更新,直接访问
基于socket写一个服务端
import socket
def server_run():
soc = socket.socket()
soc.bind(('127.0.0.1', 8008))
soc.listen(5)
while True:
conn, addr = soc.accept()
recv_data = conn.recv(1024)
print(recv_data)
# 1 直接在send里写,发送给客户端 http响应的格式
# conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>hello web</h1><img src="https://img2.woyaogexing.com/2022/12/24/a22973058eab2aafa11248a8b6031f5e.jpg"></img>')
#2 打开一个html文件,发送给客户端
# with open('index.html','r',encoding='utf-8') as f:
# data=f.read()
# conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))
# 3 动态网页,字符串替换
import time
now=time. ("%Y-%m-%d %H:%M:%S", time.localtime())
print(now)
with open('index.html','r',encoding='utf-8') as f:
data=f.read()
data=data.replace('@@',now)
conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))
conn.close()
if __name__ == '__main__':
server_run()
【2】HTTP协议
- HTTP协议是超文本传输协议
- 作用
- 服务器与本地浏览器之间传输超文本的传输协议
- 特点
- 1、基于TCP/IP之上的应用层协议 ------- 可靠协议
- 2、基于请求和响应模式:必须客户端先发起请求,服务端才响应
- 3、无状态保存
- 每一发送的请求都是新的
- 4、短链接
- 一个请求一个TCP连接,请求结束,连接断开
【2.1】http请求协议与响应协议
请求协议
请求协议:
请求首行 ------》 请求方式------》 请求地址-------》请求协议/版本号 \r\n
请求头 -------》key-value格式 \r\n \r\n\r\n
请求体:get请求一般没有请求体,post请求有请求体
响应协议
响应协议:
响应首行 ---------》HTTP/1.1 200 OK \r\n # 协议版本号 响应状态码 状态码解释
响应头:key-value格式,cookie带在响应头中,浏览器会把cookie存到浏览器的cookie中
响应体:一般为html标签,一般在浏览器看到的都是响应体内容
【2.2】URL简介,统一资源定位符
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
格式:
协议: //IP:端口(80)/路径?name=lqz&age=18
http协议,如果不写端口号,默认端口是80
?之前写的是请求路径,?后面写的请求数据部分
补充:
post请求既能携带地址栏中的数据,也能携带请求体中的数据
get请求一般都携带地址栏中的数据
补充
请求一个地址:https://www.cnblogs.com/liuqingzheng/articles
携带数据到后端的三种方式:
方式一、将数据携带在地址栏中 ------- 域名+地址+参数
https://www.cnblogs.com/liuqingzheng/articles?a=1&b=2
取值:request.GET 或者 request.get_full_path
方式二、将数据携带在请求体中 ---- http的请求体 ------ 有多种编码格式
编码格式:
1、json:序列化
2、urlencode:form表单默认的编码格式
3、form-data:传输文件使用的编码格式
取值:request.POST 或者 request.body
方式三、将数据携带在请求头中
通过 request.META ---------》取出请求头
$.ajax({ path:/login/?name=lqz, data:{} })----->写成这样---》最终它会变成一个http请求,写的path实际是请求路径,写的data就是请求体
【2.3】HTTP协议补充
HTTP协议0.9版本:
客户端 ---------- 服务端
建立链接 ---- ------ 三次握手
客户端给服务端发送消息 -------- 借助tcp通道
服务端给客户端发送消息 --------- 借助tcp通道
断开链接 ------------ 四次挥手
HTTP协议1.1版本:
长连接:
客户端同时发起两个http请求
客户端 ---------》 服务端
建立链接 ---- ------ 三次握手
第一次发送请求:
客户端给服务端发送消息 -------- 借助tcp通道
服务端给客户端发送消息 --------- 借助tcp通道
第二次发送请求:
客户端给服务端发送消息 -------- 借助tcp通道
服务端给客户端发送消息 --------- 借助tcp通道
断开链接 ------------ 四次挥手
HTTP协议2.0版本 --------》 多路复用
客户端同时发送5个http请求
客户端 --------》 服务端
建立tcp链接 -------》三次握手
tcp流式协议 -------- 》一次带多条数据(比如5条http请求数据)
tcp响应 ------》一次性将5条请求数据响应回来
断开链接 ----------》四次挥手
【3】Web框架
1、概念
Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法,浏览器和服务器的是基于HTTP协议进行通信的,大大提高了开发的效率
2、wsgi协议
客户端浏览器和 ----------------------> python web框架之间通信需要遵循这个协议
发出来的是http请求 符合wsgi协议的web服务器 django,flask requset response
基于wsgi协议的web服务器:
1、wsgiref:django框架默认使用wsgiref ---- 特点:性能低,并发量低,测试时使用
2、uwsgi:使用C语言编写
3、gunicorn:使用Python语言编写
wsgiref协议:web服务器后面的python框架一定是一个可调用对象,必须接收两个参数(environ,start_response) ------ environ接收客户端发来的所有请求
3、使用wsgiref写个web服务
from wsgiref.simple_server import make_server
def mya(environ, start_response):
print(environ)
start_response('200 OK', [('Content-Type', 'text/html')])
if environ.get('PATH_INFO') == '/index':
with open('index.html','rb') as f:
data=f.read()
elif environ.get('PATH_INFO') == '/login':
with open('login.html', 'rb') as f:
data = f.read()
else:
data=b'<h1>Hello, web!</h1>'
return [data]
# 可调用对象---》能加括号执行的对象
if __name__ == '__main__':
myserver = make_server('', 8011, mya) # 请求来了---》经过wsgiref---》调用后面的可调用对象--》传入两个参数(environ, start_response)
print('监听8011')
myserver.serve_forever()