从 Flask WSGI 到 socket 的学习记录
python
阅读时长: 1 分钟
想搞清楚flask源码
需要搞清楚 flask 逻辑
需要wsgi_app 怎么实现
1
2
3
4
|
from werkzeug.serving import run_simple
try:
run_simple(host, port, self, **options)
|
self表示Flask 实例化app = Flask(__name__)
https://segmentfault.com/a/1190000010756866
这个流程可以参考
还有一个问题,wsgi_app(environ, start_response)里的start_response为什么是个方法
里面直接返回
1
2
3
4
5
6
7
8
9
10
11
|
from eventlet import wsgi
import eventlet
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
body = '<h1>Hello, %s!</h1>' % (environ['PATH_INFO'][1:] or 'web')
return [body.encode('utf-8')]
wsgi.server(eventlet.listen(('', 8080)), application)
|
start_response('200 OK', [('Content-Type', 'text/html')])怎么理解
http://liaoph.com/python-wsgi/
socket编程方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import socket
# 创建一个socket:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('www.sina.com.cn', 80))
# 发送数据:
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
# 接收数据:
buffer = []
while True:
# 每次最多接收1k字节:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = b''.join(buffer)
# 关闭连接:
s.close()
header, html = data.split(b'\r\n\r\n', 1)
print(header.decode('utf-8'))
# 把接收的数据写入文件:
with open('sina.html', 'wb') as f:
f.write(html)
|
创建一个socket,建立连接,获取html,写入本地文件
先根据 start_response('200 OK', [('Content-Type', 'text/html')]) http://liaoph.com/python-wsgi/
理清思路,WSGI Server 实现纯手动写server
wsgi协议
再根据https://segmentfault.com/a/1190000010756866 将流程梳理