flask-02
一、web框架原理
0、web框架简单说:就是请求对象和响应对象
1、bs架构:B=浏览器、桌面端、小程序、app, S=服务器
2、最开始使用socket写一个服务端,接收的http请求,然后做一些判断执行视图函数
最初代码演示:获取当前时间
- 基于socket写一个服务端
import socket
def server_run():
soc = socket.socket()
soc.bind(('127.0.0.1', 8008))
soc.listen(5)
while True:
conn, addr = soc.accept()
recv_data = conn.recv(1024)
print(recv_data)
# 1 直接在send里写,发送给客户端
# conn.send(b'HTTP/1.1 200 OK\r\n\r\n<h1>hello web</h1><img src="https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike92%2C5%2C5%2C92%2C30/sign=5e3814acf9edab64607f4592965fc4a6/14ce36d3d539b600c0c465d0eb50352ac65cb74b.jpg"></img>')
#2 打开一个html文件,发送给客户端
# with open('index.html','r',encoding='utf-8') as f:
# data=f.read()
# conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))
# 3 动态网页,字符串替换
import time
now=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(now)
with open('index.html','r',encoding='utf-8') as f:
data=f.read()
data=data.replace('@@@',now)
conn.send(('HTTP/1.1 200 OK\r\n\r\n%s'%data).encode('utf-8'))
conn.close()
if __name__ == '__main__':
server_run()
index页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
现在时间是:@@@
</body>
</html>
3、使用wsgiref
写,他把socket
都处理好了,只剩下处理路径和视图函数的匹配关系
- 调用了
make_sever模块
-
mya是可被调用的对象,能加括号执行的,
-
能被调用的是:函数,类,对象加括号 咱们之前写的都是p=Person() 其实也可以p()这样会触发Person的
__call__魔法方法
- 无论是django还是flask都是用户浏览器发送http请求,经过web服务器,把请求拆成
environ
和start_response
传进后面django或者flask框架,最后响应完放进start_response经过wsgi变成响应的一套返回给前端
代码演示
from wsgiref.simple_server import make_server
def mya(environ, start_response):
print(environ) # environ 是http请求进入python后,被变成了字典
start_response('200 OK', [('Content-Type', 'text/html')])
if environ.get('PATH_INFO') == '/index':
with open('index.html', 'rb') as f:
data = f.read()
elif environ.get('PATH_INFO') == '/login':
with open('login.html', 'rb') as f:
data = f.read()
else:
data = b'<h1>Hello, web!</h1>'
return [data]
if __name__ == '__main__':
# mya是可被调用的对象,能加括号执行的,能被调用的是:函数,类,对象加括号 p=Person() ---> p()--->触发Person的__call__
# 请求来了,会执行mya加括号,并把 environ, start_response 传进去,django,flask也这样
myserver = make_server('', 8011, mya)
print('监听8011')
myserver.serve_forever()
4、flask基于werkzeug执行的
- werkzeug在wsgi的基础上又做了一层封装,变得更简洁了,不需要传environ和start_response,直接传个request就可以,从request里拿path、GET、POST,都封装在request里了
二、flask展示用户信息案例