3、第十 - WEB开发进阶 - WEB前端框架介绍
Web框架:其实就是socket间的数据传输。
Python3 string(字符串) 转换到 bytes(字节) 的三种方式:(编写socket传输中,经常用到 ,重点)
import hashlib
m = hashlib.md5()
第一种
m.update(b'fffff')
第二种
m.update(bytes('chen',encoding='utf8'))
#第三种
m.update(('chen').encode('utf-8'))
ret = m.hexdigest()
print(ret) 打印MD5值
1、原始版本:使用socket库编写的一个简单的socket框架
import socket
def handle_request(client):
buf = client.recv(1024)
#发送,转换成字节类型
client.send(b'HTTP/1.1 200 OK\r\n\r\n') #定义状态码
client.send('<h1>Hello,EveryOne</h1>'.encode('utf-8')) # 让浏览器解析html标签,
def main():
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('127.0.0.1',8001))
sock.listen(5)
while True:
conn,addr = sock.accept()
handle_request(conn)
conn.close()
if __name__ == '__main__':
main()
效果:

2、简化版本:使用 wsgiref 也可以完成一个简单的socket编写
from wsgiref.simple_server import make_server
def RunServer(environ,start_response):
# environ 客户发来的所有数据
# start_response 封装要返回给用户的数据,响应头状态
start_response('200 OK',[('Content-Type','text/html')])
return ['<h1> Hello,EveryOne</h1>'.encode('utf-8'),]
if __name__ == '__main__':
httpd = make_server('127.0.0.1',9000,RunServer)
httpd.serve_forever()
效果:

我们平常听的比较多的WEB框架就是MVC框架或者MTV的框架。其实简单来说 就是代码的习惯或者模型。
WEB框架
MVC
Model View Controller
数据库 模板文件 业务处理
MTV
Model Tempalte View
数据库 模板文件 业务处理
通常来讲,一个URL有不同的子页面访问,用户可能访问index或date之类 。总之,后面接的参数URL不一样,得到的页面展示不一样。
1、可通过PY脚本的处理方式,得到效果
from wsgiref.simple_server import make_server
#定义的处理方法
def handle_index():
return ['<h1>Hello,index</h1>'.encode('utf-8'), ]
def handle_date():
return ['<h1>Hello,Date</h1>'.encode('utf-8'),]
#定义字典:抓取URL总子页面信息与处理方法的对应关系。(注意字典中values不括号)
URL_DIR = {
'/index/\d+':handle_index, #对于读取多页数据,可通过正则表达匹配
'/date':handle_date
}
def RunServer(environ,start_response):
#environ 接收用户数据
#start_response 返回数据给用户
start_response('200 OK',[('Content-Type','text/html')])
#获取客户端访问URL后缀,可通过pycharm中断点查出获取的,要截取参数。
curent_url = environ['PATH_INFO']
#判断是否URL_DIR中
func = None
if curent_url in URL_DIR:
func = URL_DIR[curent_url]
#访问的链接如果在URL_DIR中,则返回字典中Values
if func:
return func()
else:
#页面不存在返回404页面
return ['<h2>404</h2>'.encode('utf-8'),]
#定义入口
if __name__ == '__main__':
httpd = make_server('127.0.0.1',9001,RunServer)
httpd.serve_forever()
可通过访问页面信息,得出不同的效果:
http://127.0.0.1:9001/index
http://127.0.0.1:9001/date
http://127.0.0.1:9001
2、可对号入座,把脚本拆分成为MVC框架的模块。
如:目录划分 创建一个web目录,包括子目录 model、view、controller (结构划分完成,便于后面代码修改)

主配置文件为:main.py
from wsgiref.simple_server import make_server
import account
URL_DIR = {
'/index':account.handle_index,
'/date':account.handle_date,
}
def RunServer(environ,start_response):
start_response('200 OK',[('Content-Type','text/html')])
curent_url = environ['PATH_INFO']
func = None
if curent_url in URL_DIR:
func = URL_DIR[curent_url]
if func:
return func()
else:
return ['<h1> 404 !!! </h1>'.encode('utf-8'),]
if __name__ == '__main__':
httpd = make_server('127.0.0.1',9002,RunServer)
httpd.serve_forever()
逻辑处理文件为:account.py
import time
def handle_index():
v = str(time.time())
f = open('../View/s1.html',mode='rb')
data = f.read()
f.close()
data = data.replace(b'@uuuu',v.encode('utf-8'))
return [data,]
def handle_date():
return ['<h1>Hello,Date</h1>'.encode('utf-8'),]
模板文件为:s1.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Index @uuuu</h1>
</body>
</html>
可通过访问页面信息,得出不同的效果:
http://127.0.0.1:9001/index
http://127.0.0.1:9001/date
http://127.0.0.1:9001
~~ 以上 ~~
人有傲骨终不贱,脚踏实地见真章;
超出预期为工作,价值体现显能力。
浙公网安备 33010602011771号