1、http,无状态,短连接
2、浏览器(socket 客户端),网站(socket 服务端)
3、自己写网站
a、写socket 服务端
b、根据URL不同返回不同内容
路由系统:
URL ->函数
c、字符串返回给用户
模板引擎渲染
HTML充当模板(占位符)
自己创建认识数据,替换占位符
4、web框架:
框架种类:
-a,b,c --> Tornado
-(第三方a),b,c -->wsgiref(a) -->Django(b,c)
-(第三方a)b,(第三方c) ---flask
分类:
-Django框架(重量级)
-其他(轻量级)
import socket import time import pymysql def f1(): f = open('test1.html','rb') data = f.read() f.close() return data def f2(): f = open('test2.html','r',encoding='utf-8') data = f.read() data1=data.replace('user',str(time.time())) f.close() return bytes(data1,encoding='utf-8') def f3(): conn=None results=None #连接数据库 conn=pymysql.connect("10.51.3.10","chenyuxiang","noifhenbo","test_django") if conn: print('创建数据库链接成功,连接信息:',conn) cur = conn.cursor(cursor=pymysql.cursors.DictCursor)#创建游标,cursor=pymysql.cursors.DictCursor 设置返回格式为字典 query_sql = 'SELECT id,username,`password` from userinfo;'#要执行的sql语句 cur.execute(query_sql) results = cur.fetchall()#取所有查询结果 cur.close() conn.close() tmp_list=[] #循环处理,每一行生成一组tr for tmp in results: t_list = '<tr><th>{0}</th><th>{1}</th><th>{2}</th></tr>'.format(tmp['id'],tmp['username'],tmp['password']) tmp_list.append(t_list) content = ''.join(tmp_list)#拼接所有的tr f = open('test3.html','r',encoding='utf-8') data = f.read() f.close() data1=data.replace('@@ws@@',content)#替换占位符 return bytes(data1,encoding='utf-8') def f4(): conn=pymysql.connect("10.51.3.10","chenyuxiang","noifhenbo","test_django") cur = conn.cursor(cursor=pymysql.cursors.DictCursor)#创建游标,cursor=pymysql.cursors.DictCursor 设置返回格式为字典 query_sql = 'SELECT id,username,`password` from userinfo;'#要执行的sql语句 cur.execute(query_sql) user_list = cur.fetchall()#取所有查询结果 cur.close() conn.close() f = open('test4.html','r',encoding='utf-8') data = f.read() f.close() #利用from jinja2 import Template 做模板渲染功能 from jinja2 import Template #导入渲染模块 template = Template(data) data1 = template.render(userlist=user_list) print(data1,type(data1)) return bytes(data1,encoding='utf-8') routers = {'/test1':f1, '/test2':f2, '/test3':f3, '/test4':f4} def mysockeyservers(): hostName = "172.30.220.76" hostPort = 8080 arders =(hostName,hostPort) sock = socket.socket() sock.bind(arders)#绑定地址 sock.listen(5)#监听 while True: conn , addr = sock.accept() #阻塞住 data=conn.recv(1024)#获取数据 sdata=str(data,encoding='utf-8') #bytes转换未字符串 headers,bodys=sdata.split('\r\n\r\n') #分割获取请求头和请求体 templist = headers.split('\r\n')#请求头再用换行分割 method,url,protocol =templist[0].split(' ') #空格分割获取 method,url,protocol print(templist[0],url) # 必须以HTTP响应头的格式返回数据,否则浏览器无法正常解析 # 同时注意send的数据不能是str字符串,必须是bytes,否则会报错。 conn.send(b'HTTP/1.1 200 OK\r\n\r\n') sendmsg = bytes('<h1>testrepost</h1>',encoding='utf-8') func_name = None for item in routers: if item==url: func_name = routers[item] break if func_name: response = func_name() else: response=b'404 not found' conn.send(response) conn.close()#关闭连接 if __name__ == '__main__': mysockeyservers() # f3()