目录
1.web框架理解
2.http工作原理
3.通过函数实现浏览器和服务端通信案例
4.服务器程序和引用程序理解
5.jinja2渲染模板案例
6.Django简单说明
Web框架的本质
web应用本质上就是一个socket服务端,而浏览器就是一个socket客户端,这样就可以实现web框架了
socket web服务器
import socket server = socket.socket() server.bind(('127.0.0.1',8000)) server.listen() while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"OK") conn.close()
http协议规定了浏览器发送消息或者服务器回复消息都要按照它规定来写
执行上面那段代码print(data)会得到以下结果
将\r\n替换成换行后的结果 GET / HTTP/1.1 Host: 127.0.0.1:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3355.4 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: csrftoken=CtHePYARJOKNx5oNVwxIteOJXpNyJ29L4bW4506YoVqFaIFFaHm0EWDZqKmw6Jm8
访问博客园返回浏览器的信息
由此可见首发信息都是按照一定格式来的,所以需要了解http协议工作模式
Http工作原理:
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,
请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。 以下是 HTTP 请求/响应的步骤: 1. 客户端连接到Web服务器 一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.luffycity.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,按下回车之后会经历以下流程: 1.浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址; 2.解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接; 2.浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器; 4.服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器; 5.释放 TCP连接; 6.浏览器将该 html 文本并显示内容;
http请求格式
http响应格式:
通过函数实现浏览器和服务端通信案例
自定义web框架按照http格式发送响应并根据url中的路径返回不同的内容
import socket server = socket.socket() server.bind(('127.0.0.1',8000)) server.listen() while True: conn,addr = server.accept() data = conn.recv(1024) data = data.decode('utf-8') print(data) url = data.split()[1] if url == '/home/': conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>home<h1>') elif url == '/index/': conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>index<h1>') else: conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>404 not found<h1>') conn.close()
基于函数实现url不同路径返回不同内容
import socket server = socket.socket() server.bind(('127.0.0.1',8000)) server.listen() def func(url): s = f"this is {url} page" return bytes(s,encoding="utf-8") while True: conn,addr = server.accept() data = conn.recv(8096) data = str(data,encoding="utf-8") print(data) data1= data.split("\r\n")[0] url = data1.split()[1] conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>ok<h1>') 这个地方需要注意的一个点 闭合标签不能写/ 否则就当成普通字符串进行处理 if url == "/index/": response = func(url) elif url == "/home/": response = func(url) else: response = b"404 not found" conn.send(response) conn.close()
实现url不同路径返回不同内容函数进阶版
import socket server =socket.socket() server.bind(('127.0.0.1',8000)) server.listen() def index(url): s = f"This is {url} page" return bytes(s,encoding="utf-8") def home(url): s = f"This is {url} page" return bytes(s,encoding="utf-8") list1 = [("/index/",index), ("/index/",home)] while True: conn,addr = server.accept() data = conn.recv(8096) data = str(data,encoding="utf-8") print(data) data1= data.split("\r\n")[0] url = data1.split()[1] conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>ok<h1>') func = None for item in list1: if item[0] == url: func = item[1] break if func: response = func(url) else: response = b"404 not found" conn.send(response) conn.close()
返回具体的html文件
import socket server =socket.socket() server.bind(('127.0.0.1',8000)) server.listen() def index(url): with open("template/index.html","r",encoding="utf-8") as f: s = f.read() return bytes(s,encoding="utf-8") def home(url): with open("template/home.html", "r", encoding="utf-8") as f: s = f.read() return bytes(s,encoding="utf-8") list1 = [("/index/",index), ("/home/",home)] while True: conn,addr = server.accept() data = conn.recv(8096) data = str(data,encoding="utf-8") print(data) data1= data.split("\r\n")[0] url = data1.split()[1] conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>ok<h1>') func = None for item in list1: if item[0] == url: func = item[1] break if func: response = func(url) else: response = b"404 not found" conn.send(response) conn.close()
网页动态
import socket server =socket.socket() server.bind(('127.0.0.1',8000)) server.listen() def index(url): with open("template/index.html","r",encoding="utf-8") as f: s = f.read() return bytes(s,encoding="utf-8") def home(url): with open("template/home.html", "r", encoding="utf-8") as f: s = f.read() return bytes(s,encoding="utf-8") def timer(url): import time with open("template/timer.html","r",encoding="utf-8") as f: s = f.read() s = s.replace('@@time@@',time.strftime("%Y-%m-%d %H:%M:%S")) return bytes(s,encoding="utf-8") list1 = [("/index/",index), ("/home/",home), ("/time/",timer)] while True: conn,addr = server.accept() data = conn.recv(8096) data = str(data,encoding="utf-8") print(data) data1= data.split("\r\n")[0] url = data1.split()[1] conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>ok<h1>') func = None for item in list1: if item[0] == url: func = item[1] break if func: response = func(url) else: response = b"404 not found" conn.send(response) conn.close()