web框架原理
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('\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与函数的对应关系
# ②写函数与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>

浙公网安备 33010602011771号