web框架原理
web框架主要分为三个部分
1、启动socket服务端
2、路由系统,写出uri与函数的对应关系
3、模板引擎渲染,将html页面与mysql中的数据进行融合
启动socket服务端
import socket server = socket.socket() server.bind(('127.0.0.1',8080)) server.listen(5) # ①写socket服务端 while True: conn, addr = server.accept() data = conn.recv(8192) data = str(data,encoding='utf-8') header = data.split(' ')[0].split(' ')[0] # 拿到需要的头部信息 GET / HTTP/1.1 router = header.split(' ')[1] # 获取浏览器访问的uri信息 / # 我们要写一个uri与对应函数的映射关系 # 拿出uri对应的函数名,调用 func_name = None for rout in router_list: if rout[0] == router: func_name = rout[1] break # 判断访问的uri是否存在映射关系 if func_name: # 有就存在 res = bytes('访问成功',encoding='utf-8') else: res = bytes('访问不存在',encoding='utf-8') # 拿到要返回给浏览器的结果后开始返回数据 # 我们需要先返回一个响应头 conn.send(bytes('HTTP/1.1 200 OK ')) # 最简单的响应头 # 再发送主体信息 conn.send(res) # 关闭一次连接 conn.close()
路由系统 - uri与函数的对应关系
# ②写函数与uri的映射关系 def home(): pass def index(): pass router_list = [ ('/',home), ('/index',index) ] # ①写socket服务端 while True: conn, addr = server.accept() data = conn.recv(8192) data = str(data,encoding='utf-8') header = data.split(' ')[0].split(' ')[0] # 拿到需要的头部信息 GET / HTTP/1.1 router = header.split(' ')[1] # 获取浏览器访问的uri信息 / # 我们要写一个uri与对应函数的映射关系 # 拿出uri对应的函数名,调用 func_name = None for rout in router_list: if rout[0] == router: func_name = rout[1] break # 判断访问的uri是否存在映射关系 if func_name: # 有就存在 res = bytes('访问成功',encoding='utf-8') else: res = bytes('访问不存在',encoding='utf-8') # 拿到要返回给浏览器的结果后开始返回数据 # 我们需要先返回一个响应头 conn.send(bytes('HTTP/1.1 200 OK ')) # 最简单的响应头 # 再发送主体信息 conn.send(res) # 关闭一次连接 conn.close()
模板引擎渲染
自定义规则
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>渲染模板</title> </head> <body> <table> <!--占位字符--> @@content@@ </table> </body> </html>
def home(): # 返回静态页面 # 先读出静态html文件 f = open('静态页面.html','r') data = f.read() f.close() return bytes(data,encoding='utf-8') def index(): # 也要先读出html页面 f = open('静态页面.html', 'r') data = f.read() f.close() # 模板引擎渲染,将html代码与mysql数据库进行融合(自己定制规制,或者使用第三方工具) # 第一种,自定义规则,先在需要放数据的地方用自定义的占位符占位 # 链接数据库,取出想要的数据 import pymysql conn = pymysql.connect(host='127.0.0.1',user='root',password='123', database='db1',charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = "select * from table1" res = cursor.fetchall() # 取出来的是一个列表里面套字典的形式,我们需要拿出我们需要的值进行字符串拼接 r_list = [] for r in res: s = '<tr><td>%s</td><td>%s</td></tr>'%(r['name'],r['pwd']) r_list.append(s) # 全部添加完之后再做一个整体的拼接 need = ''.join(r_list) # 拼接好之后进行替换出我们之前html中的占位字符 res = data.replace('@@content@@',need) # 替换好之后可以把信息返回给浏览器了 return bytes(res,encoding='utf-8')
使用第三方工具jinja2
def home(): # 返回静态页面 # 先读出静态html文件 f = open('静态页面.html','r') data = f.read() f.close() return bytes(data,encoding='utf-8') def index(): # 也要先读出html页面 f = open('静态页面.html', 'r') data = f.read() f.close() # 模板引擎渲染,将html代码与mysql数据库进行融合(自己定制规制,或者使用第三方工具) # 链接数据库,取出想要的数据 import pymysql conn = pymysql.connect(host='127.0.0.1',user='root',password='123', database='db1',charset='utf8') cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = "select * from table1" res = cursor.fetchall() # 第二种模板引擎渲染是通过第三方的工具,这里用的是jinja2 from jinja2 import Template template = Template(data) res = template.render(user= res) # 这里需要把key和html里的占位符对应好 return bytes(res,encoding='utf-8')
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>渲染模板</title> </head> <body> <table> <!-- 这里的占位符是{{name}} 外面传值必须通过key,value传值, key需要与占位字符一致 --> {{name}} <!-- 如果外面传进来列表,在这里也可以循环--> {% for k in name %} <!-- 如果循环出来的k是字典,可以用点key进行取值--> <td>{{k.name}}</td> {% endfor %} </table> </body> </html>