标签:设置 %s content 定义 http get break sim png hal
HTTP GET 请求格式:
HTTP响应的格式:
返回具体的HTML文件:
我们可以打开HTML文件,读取出它内部的二进制数据,然后再发送给浏览器。
1 """ 2 根据URL中不同的路径返回不同的内容--函数进阶版 3 返回独立的HTML页面 4 """ 5 6 import socket 7 8 sk = socket.socket() 9 sk.bind(("127.0.0.1", 8080)) # 绑定IP和端口 10 sk.listen() # 监听 11 12 13 # 将返回不同的内容部分封装成不同的函数 14 def index(url): 15 # 读取index.html页面的内容 16 with open("index.html", "r", encoding="utf8") as f: 17 s = f.read() 18 # 返回字节数据 19 return bytes(s, encoding="utf8") 20 21 22 def home(url): 23 with open("home.html", "r", encoding="utf8") as f: 24 s = f.read() 25 return bytes(s, encoding="utf8") 26 27 28 # 定义一个url和实际要执行的函数的对应关系 29 list1 = [ 30 ("/index/", index), 31 ("/home/", home), 32 ] 33 34 while True: 35 # 等待连接 36 conn, add = sk.accept() 37 data = conn.recv(8096) # 接收客户端发来的消息 38 # 从data中取到路径 39 data = str(data, encoding="utf8") # 把收到的字节类型的数据转换成字符串 40 # 按\r\n分割 41 data1 = data.split("\r\n")[0] 42 url = data1.split()[1] # url是我们从浏览器发过来的消息中分离出的访问路径 43 conn.send(b‘HTTP/1.1 200 OK\r\n\r\n‘) # 因为要遵循HTTP协议,所以回复的消息也要加状态行 44 # 根据不同的路径返回不同内容 45 func = None # 定义一个保存将要执行的函数名的变量 46 for item in list1: 47 if item[0] == url: 48 func = item[1] 49 break 50 if func: 51 response = func(url) 52 else: 53 response = b"404 not found!" 54 55 # 返回具体的响应消息 56 conn.send(response) 57 conn.close()
利用wsgiref模块替换我们写的web框架的socket server 部分:
1 """ 2 根据URL中不同的路径返回不同的内容--函数进阶版 3 返回HTML页面 4 让网页动态起来 5 wsgiref模块版 6 """ 7 8 from wsgiref.simple_server import make_server 9 10 11 # 将返回不同的内容部分封装成函数 12 def index(url): 13 # 读取index.html页面的内容 14 with open("index.html", "r", encoding="utf8") as f: 15 s = f.read() 16 # 返回字节数据 17 return bytes(s, encoding="utf8") 18 19 20 def home(url): 21 with open("home.html", "r", encoding="utf8") as f: 22 s = f.read() 23 return bytes(s, encoding="utf8") 24 25 26 def timer(url): 27 import time 28 with open("time.html", "r", encoding="utf8") as f: 29 s = f.read() 30 s = s.replace(‘@@time@@‘, time.strftime("%Y-%m-%d %H:%M:%S")) 31 return bytes(s, encoding="utf8") 32 33 34 # 定义一个url和实际要执行的函数的对应关系 35 list1 = [ 36 ("/index/", index), 37 ("/home/", home), 38 ("/time/", timer), 39 ] 40 41 42 def run_server(environ, start_response): 43 start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html;charset=utf8‘), ]) # 设置HTTP响应的状态码和头信息 44 url = environ[‘PATH_INFO‘] # 取到用户输入的url 45 func = None 46 for i in list1: 47 if i[0] == url: 48 func = i[1] 49 break 50 if func: 51 response = func(url) 52 else: 53 response = b"404 not found!" 54 return [response, ] 55 56 57 if __name__ == ‘__main__‘: 58 httpd = make_server(‘127.0.0.1‘, 8090, run_server) 59 print("我在8090等你哦...") 60 httpd.serve_forever()
jinja2:
上面的代码实现了一个简单的动态,我完全可以从数据库中查询数据,然后去替换我html中的对应内容,然后再发送给浏览器完成渲染。 这个过程就相当于HTML模板渲染数据。 本质上就是HTML内容中利用一些特殊的符号来替换要展示的数据。 我这里用的特殊符号是我定义的,其实模板渲染有个现成的工具: jinja2
下载jinja2:
pip install jinja2
index2 文件:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <h1>姓名:{{name}}</h1> <h1>爱好:</h1> <ul> {% for hobby in hobby_list %} <li>{{hobby}}</li> {% endfor %} </ul> </body> </html>
使用jinja2渲染index2.html文件:
from wsgiref.simple_server import make_server from jinja2 import Template def index(url): # 读取HTML文件内容 with open("index2.html", "r", encoding="utf8") as f: data = f.read() template = Template(data) # 生成模板文件 ret = template.render({‘name‘: ‘alex‘, ‘hobby_list‘: [‘抽烟‘, ‘喝酒‘, ‘烫头‘]}) # 把数据填充到模板中 return bytes(ret, encoding="utf8") def home(url): with open("home.html", "r", encoding="utf8") as f: s = f.read() return bytes(s, encoding="utf8") # 定义一个url和实际要执行的函数的对应关系 list1 = [ ("/index/", index), ("/home/", home), ] def run_server(environ, start_response): start_response(‘200 OK‘, [(‘Content-Type‘, ‘text/html;charset=utf8‘), ]) # 设置HTTP响应的状态码和头信息 url = environ[‘PATH_INFO‘] # 取到用户输入的url func = None for i in list1: if i[0] == url: func = i[1] break if func: response = func(url) else: response = b"404 not found!" return [response, ] if __name__ == ‘__main__‘: httpd = make_server(‘127.0.0.1‘, 8090, run_server) print("我在8090等你哦...") httpd.serve_forever()
使用pymysql连接数据库:
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", passwd="xxx", db="xxx", charset="utf8") cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) cursor.execute("select name, age, department_id from userinfo") user_list = cursor.fetchall() cursor.close() conn.close()
标签:设置 %s content 定义 http get break sim png hal
原文地址:https://www.cnblogs.com/WHWWHW/p/10268724.html