web引入
web的应用本质
socket网络编程
架构:c/s架构
协议:TCP/udp协议
传输层
web应用:
架构:B/S架构
协议:HTTP协议
应用层
字节转字符串 str(res,encoding="utf-8")
字符串转自截 bytes(data,encoding='utf-8')
web框架总结
a.自己写socket服务端
b.路由系统: 将客户端请求的url映射到相对应的函数, 最后执行函数即可
c.模版渲染: a自己自定义的规则。b使用第三方的工具*jinja2
web框架分类
1第一种唯度分类:
a,b,c都写的----tornado
a(引入第三方),b,c----django。
a,c(引入第三方) b------flask
2.第二种唯度分类:
1.djiango
--orm
--session
--form表单验证
2.其他
*自定义web框架
目标:
将自定制的server变成一个动态的server
Http协议: (**************************************)
请求头:
GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
请求体:
请求的内容
响应头:
HTTP/1.1 200 OK
响应体:
"hello world"
(用户看到的内容)
改造之后, 动态的server:
def f1():
return bytes('xxxx', encoding='utf-8')
def f2():
return bytes('oooo', encoding='utf-8')
def f3():
return bytes('aaaa', encoding='utf-8')
#### 路由系统 作用: 将客户端请求的url映射到相对应的函数, 最后执行函数即可
routes = [
('/xxx', f1),
('/ooo', f2),
('/aaa', f3),
]
def run():
import socket
sock = socket.socket()
sock.bind(('127.0.0.1', 8080))
sock.listen(5)
while True:
conn, addr = sock.accept()
data = conn.recv(8090)
# print(data)
### 转成字符串类型
data_str = str(data, encoding='utf-8')
header_list = data_str.split('\r\n\r\n')
headers = header_list[0]
url = headers.split('\r\n')[0].split(' ')[1]
### 判断url
# if url == '/xxx':
# res = bytes('xxxx', encoding='utf-8')
# elif url == '/ooo':
# res = bytes('oooo', encoding='utf-8')
# else:
# res = bytes('404 not found', encoding='utf-8')
func_name = None
for items in routes:
if items[0] == url:
func_name = items[1]
break
if func_name:
res = func_name()
else:
res = bytes('404 not found', encoding='utf-8')
conn.send(bytes("HTTP/1.1 200 OK\r\n\r\n",encoding='utf-8'))
conn.send(res)
conn.close()
程序的道路上一去不复返