#以下是自己开发的web框架:
# 1.
# Http,无状态,短连接:连接一次断开一次,下次来就不知你是谁。
# 2.
# 浏览器(socket客户端)
# 网站(socket服务端)
# 3.
# 自己写网站
# a.socket服务端
# b.路由系统:
# 根据URL不同返回不同的内容
# URL -> 函数
# c.字符串返回给用户
# 模板引擎渲染(替换):
# HTML充当模板(特殊字符)
# 自己创造任意数据
# 4.
# Web框架种类:
# - a, b, c --> Tornado
# - [第三方a -->wsgiref], b, c --> Django
# - [第三方a -->wsgiref], b, [第三方c -->jinja2] --> flask,
import socket
import pymysql
def f1(request):
with open('form.html','r',encoding='utf-8') as f:#rb操作时不支持指定encoding参数
content = f.read()
return content
def f2(request):
with open('table.html','r',encoding='utf-8') as f:
content = f.read()
import random
age = random.randint(1,100)
content = content.replace('@@age@@',str(age))
return content
def f3(request):
#1.获取数据库的数据
conn = pymysql.connect(host='localhost',port=3306,user='root',password='123',database='db1',charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)#获取的结果是字典
cursor.execute('select id,username,password from userinfo')
user_list = cursor.fetchall()#获取全部数据,列表里面的元素是字典
print(user_list)#[{'id': 1, 'username': 'tom', 'password': '111'}, {'id': 2, 'username': 'marry', 'password': '222'}, {'id': 3, 'username': 'jack', 'password': '333'}, {'id': 10, 'username': 'alex', 'password': '555'}, {'id': 11, 'username': 'tommy', 'password': '777'}]
cursor.close()
conn.close()
#2.将数据放在row里面,得到row_list,它是一个列表,里面的元素都是字符串
row_list = []
for dict in user_list:
row = '<tr><td>%s</td><td>%s</td><td>%s</td></tr>'%(dict['id'],dict['username'],dict['password'])
row_list.append(row)
print(row_list)
#3.列表跟空字符拼接,得到一个字符串row_str
row_str = ''.join(row_list)
print(row_str)
#4.打开table1.html,读取内容,把tbody的@@row@@替换成row_str,最后返回给浏览器。
with open('table1.html','r',encoding='utf-8') as f:
content = f.read()
content = content.replace('@@row@@',row_str)
print(content)
return content
def f4(request):
conn = pymysql.connect(host='localhost',port=3306,user='root',password='123',database='db1',charset='utf8')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)#获取的结果是字典
cursor.execute('select id,username,password from userinfo')
user_list = cursor.fetchall()
cursor.close()
conn.close()
with open('table2.html','r',encoding='utf-8') as f:
content = f.read()
#基于第三方工具实现的模板渲染(替换)
from jinja2 import Template
template = Template(content)#把读取的html内容传参,得到实例化对象
content = template.render(user_list=user_list)
return content
url_list = [('/form.html',f1),('/table.html',f2),('/table1.html',f3),('/table2.html',f4)]#可请求的url
def run():
sk = socket.socket()
sk.bind(('127.0.0.1',8999))
sk.listen(10)
while True:
conn,addr = sk.accept()
data = conn.recv(1024).decode('utf-8')#接收请求。如果不解码,得到的data有很多换行符\r\n,可清晰的看到结构
# print(data)
header,body = data.split('\r\n\r\n')#请求头和请求体是用两个换行符隔开
header_item = header.split('\r\n')#请求头里面的内容是用一个换行符隔开,得到一个列表
# print(header_item)
get,url,http = header_item[0].split(' ')#请求头的第一个元素是用一个空格隔开
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')#http协议
#路由系统:url跟函数有关系,根据url不同,返回不同的内容
for item in url_list:
if item[0] == url:#如果url是对的
ret = item[1](data)#就把请求传参给函数,拿到返回值
conn.send(ret.encode('utf-8'))
break
else:
conn.send(b'404 not found')
conn.close()
if __name__ == '__main__':
run()