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>