Ricardo

从 Flask WSGI 到 socket 的学习记录

阅读时长: 1 分钟

想搞清楚flask源码

需要搞清楚 flask 逻辑

需要wsgi_app 怎么实现

Python
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为什么是个方法

里面直接返回

Python
 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编程方式

Python
 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 将流程梳理

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
记录自己
Built with Hugo
主题 Stack 由 Jimmy 设计