自己实现 web框架
首先要有 socket 【代码如下】
1 import socket 2 sk= socket.socket() 3 sk.bind(("192.168.11.56",8085)) 4 sk.listen(5) 5 while True: 6 conn,addr = sk.accept() 7 data = conn.recv(8096) 8 conn.send(b"OK") 9 conn.close()
1 import socket 2 3 sk = socket.socket() 4 sk.bind(("127.0.0.1", 8080)) 5 sk.listen(5) 6 7 while True: 8 conn, addr = sk.accept() # 夯在此地,等待链接 9 data = conn.recv(8096) 10 print(data) 11 conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n") # 响应头 12 conn.send(bytes("<h1>hello...你好啊~</h1>", encoding="utf-8")) # 响应体 13 conn.close()
需求一:不同的url,返回不同的内容 【意思就是访问主页就返回主页 访问个人中心就返回个人中心】
【利用请求头的第一行中间那个位置,会又请求具体的URL】
【利用字符串分割】
1 """ 2 不同的URL,返回不同的内容 3 """ 4 import socket 5 6 sk = socket.socket() 7 sk.bind(("127.0.0.1", 8080)) 8 sk.listen(5) 9 10 while True: 11 conn, addr = sk.accept() # 夯在此地,等待链接 12 data = conn.recv(8096) 13 # 类型转换 字节类型-->字符串 14 data_str = str(data, encoding="utf-8") 15 # 取到请求头 16 header = data_str.split("\r\n\r\n")[0] 17 # 再取到 “GET / HTTP/1.1” 18 tmp = header.split("\r\n")[0] 19 # 再按照空格分割,得到列表,取索引值是1的 20 url = tmp.split(" ")[1] 21 conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n") # 响应头 22 # 根据请求URL的不同,我返回不同的内容 23 if url == "/index/": 24 response = "这是主页。。。" 25 else: 26 response = "404" 27 conn.send(bytes(response, encoding="utf-8")) # 响应体 28 conn.close()
需求二:当页面太多,我又不可能挨个写if 判断
【for循坏来处理】
1 import socket 2 3 sk = socket.socket() 4 sk.bind(("127.0.0.1", 8080)) 5 sk.listen(5) 6 7 def index(): 8 return "这是主页" 9 10 def info(): 11 return "这是个人信息页" 12 13 14 url_func_map = [ 15 ("/index/", index), 16 ("/info/", info) 17 ] 18 19 20 while True: 21 conn, addr = sk.accept() # 夯在此地,等待链接 22 data = conn.recv(8096) 23 # 类型转换 字节类型-->字符串 24 data_str = str(data, encoding="utf-8") 25 # 取到请求头 26 header = data_str.split("\r\n\r\n")[0] 27 # 再取到 “GET / HTTP/1.1” 28 tmp = header.split("\r\n")[0] 29 # 再按照空格分割,得到列表,取索引值是1的 30 url = tmp.split(" ")[1] 31 conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n") # 响应头 32 # 根据请求URL的不同,我返回不同的内容 33 func_name = None # 定义一个存放将要执行函数的变量 34 # for循环url_func_map 35 for i in url_func_map: 36 if i[0] == url: 37 func_name = i[1] 38 break 39 if func_name: 40 response = func_name() 41 else: 42 response = "404" 43 conn.send(bytes(response, encoding="utf-8")) # 响应体 44 conn.close()
需求三:返回的内容要是我写好html文件
【with poen(“xx.html”,encoding=“utf-8”)as f:f.read()】【处理逻辑,打开在读取】
1 """ 2 不同的URL,返回不同的内容 3 返回的内容要是我写好的html文件 4 """ 5 import socket 6 7 sk = socket.socket() 8 sk.bind(("127.0.0.1", 8080)) 9 sk.listen(5) 10 11 def login(): 12 with open("login.html", encoding="utf-8") as f: 13 data = f.read() 14 return data 15 16 def index(): 17 with open("index.html", encoding="utf-8") as f: 18 data = f.read() 19 return data 20 21 def info(): 22 return "这是个人信息页" 23 24 25 url_func_map = [ 26 ("/login/", login), 27 ("/index/", index), 28 ("/info/", info) 29 ] 30 31 32 while True: 33 conn, addr = sk.accept() # 夯在此地,等待链接 34 data = conn.recv(8096) 35 # 类型转换 字节类型-->字符串 36 data_str = str(data, encoding="utf-8") 37 # 取到请求头 38 header = data_str.split("\r\n\r\n")[0] 39 # 再取到 “GET / HTTP/1.1” 40 tmp = header.split("\r\n")[0] 41 # 再按照空格分割,得到列表,取索引值是1的 42 url = tmp.split(" ")[1] 43 conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n") # 响应头 44 # 根据请求URL的不同,我返回不同的内容 45 func_name = None # 定义一个存放将要执行函数的变量 46 # for循环url_func_map 47 for i in url_func_map: 48 if i[0] == url: 49 func_name = i[1] 50 break 51 if func_name: 52 response = func_name() 53 else: 54 response = "404" 55 conn.send(bytes(response, encoding="utf-8")) # 响应体 56 conn.close()
需求四:静态网站都是死页面,我们现在要实现一个动态页面
1 """ 2 不同的URL,返回不同的内容 3 返回的内容要是我写好的html文件 4 html里面的内容要动起来 5 """ 6 import socket 7 8 sk = socket.socket() 9 sk.bind(("127.0.0.1", 8080)) 10 sk.listen(5) 11 12 def login(): 13 with open("login.html", encoding="utf-8") as f: 14 data = f.read() 15 import time 16 time_s = str(time.time()) 17 data_new = data.replace("@@xx@@", time_s) 18 return data_new 19 20 def index(): 21 with open("index.html", encoding="utf-8") as f: 22 data = f.read() 23 return data 24 25 def info(): 26 return "这是个人信息页" 27 28 29 url_func_map = [ 30 ("/login/", login), 31 ("/index/", index), 32 ("/info/", info) 33 ] 34 35 36 while True: 37 conn, addr = sk.accept() # 夯在此地,等待链接 38 data = conn.recv(8096) 39 # 类型转换 字节类型-->字符串 40 data_str = str(data, encoding="utf-8") 41 # 取到请求头 42 header = data_str.split("\r\n\r\n")[0] 43 # 再取到 “GET / HTTP/1.1” 44 tmp = header.split("\r\n")[0] 45 # 再按照空格分割,得到列表,取索引值是1的 46 url = tmp.split(" ")[1] 47 conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n") # 响应头 48 # 根据请求URL的不同,我返回不同的内容 49 func_name = None # 定义一个存放将要执行函数的变量 50 # for循环url_func_map 51 for i in url_func_map: 52 if i[0] == url: 53 func_name = i[1] 54 break 55 if func_name: 56 response = func_name() 57 else: 58 response = "404" 59 conn.send(bytes(response, encoding="utf-8")) # 响应体 60 conn.close()
需求五:与数据库交互实现动态
先导入数据库模块 【 import pymysql 】
cdm 启动 数据库 mysql -->> show databases 【找到已有的库】 -->> use dayXX 【切到表】 -->> show tables 【查看表】
1 """ 2 不同的URL,返回不同的内容 3 返回的内容要是我写好的html文件 4 html里面的内容要动起来 5 数据要从数据库中查找 6 """ 7 import socket 8 9 sk = socket.socket() 10 sk.bind(("127.0.0.1", 8080)) 11 sk.listen(5) 12 13 def login(): 14 with open("login.html", encoding="utf-8") as f: 15 data = f.read() 16 import time 17 time_s = str(time.time()) 18 data_new = data.replace("@@xx@@", time_s) 19 return data_new 20 21 def index(): 22 with open("index.html", encoding="utf-8") as f: 23 data = f.read() 24 # 链接数据库,找数据 25 import pymysql 26 conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="", db="day48", charset="utf-8") 27 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) 28 cursor.execute("select id, name, balance from user") 29 user_list = cursor.fetchall() 30 cursor.close() 31 conn.close() 32 """ 33 <tr> 34 <td>id</td> 35 <td>name</td> 36 <td>balance</td> 37 </tr> 38 """ 39 ret = "" 40 for i in user_list: 41 ret += """ 42 <tr> 43 <td>{0}</td> 44 <td>{1}</td> 45 <td>{2}</td> 46 </tr> 47 """.format(i["id"], i["name"], i["balance"]) 48 data_new = data.replace("@@xx@@", ret) 49 return data_new 50 51 52 def info(): 53 return "这是个人信息页" 54 55 56 url_func_map = [ 57 ("/login/", login), 58 ("/index/", index), 59 ("/info/", info) 60 ] 61 62 63 while True: 64 conn, addr = sk.accept() # 夯在此地,等待链接 65 data = conn.recv(8096) 66 # 类型转换 字节类型-->字符串 67 data_str = str(data, encoding="utf-8") 68 # 取到请求头 69 header = data_str.split("\r\n\r\n")[0] 70 # 再取到 “GET / HTTP/1.1” 71 tmp = header.split("\r\n")[0] 72 # 再按照空格分割,得到列表,取索引值是1的 73 url = tmp.split(" ")[1] 74 conn.send(b"HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\n\r\n") # 响应头 75 # 根据请求URL的不同,我返回不同的内容 76 func_name = None # 定义一个存放将要执行函数的变量 77 # for循环url_func_map 78 for i in url_func_map: 79 if i[0] == url: 80 func_name = i[1] 81 break 82 if func_name: 83 response = func_name() 84 else: 85 response = "404" 86 conn.send(bytes(response, encoding="utf-8")) # 响应体 87 conn.close()
pycharm链接数据库:




user:root 【 不是表 图写错了】


浙公网安备 33010602011771号