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()
自定义web框架
原文地址:https://www.cnblogs.com/WHWWHW/p/10268724.html