web框架主要分为三个部分html
一、启动socket服务端mysql
二、路由系统,写出uri与函数的对应关系web
三、模板引擎渲染,将html页面与mysql中的数据进行融合sql
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('\r\n\r\n')[0].split('\r\n')[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 \r\n\r\n')) # 最简单的响应头 # 再发送主体信息 conn.send(res) # 关闭一次链接 conn.close()
# ②写函数与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('\r\n\r\n')[0].split('\r\n')[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 \r\n\r\n')) # 最简单的响应头 # 再发送主体信息 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>