1.Python web框架介绍
web框架分类
-Django:大而全,快速开发,公司内部项目
-Flask:小而精,不具备web开发好多功能,丰富的第三方插件
-FastApi:异步框架,主要为了做前后端分离接口
-Sanic:异步框架,只支持python3.6 及以上,性能比较高
2.wsgiref与wsgi
符合wsgi协议的web服务器
django的web服务使用wsgiref
相当于个socket服务端,可以接收客户端发送过来的请求,处理后返回给客户端
2.1 wsgiref 工作流程详解
实际就是基于wsgi的封装
将environ包装成新的request对象
返回response,再写入start_response
返回给浏览器做响应
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3f0e6aaa2700549b4da31ab813f2e0f7.png)
2.3 wsgi
wsgi.py
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'companion.settings.prod')
application = get_wsgi_application()
get_wsgi_application
import django
from django.core.handlers.wsgi import WSGIHandler
def get_wsgi_application():
django.setup(set_prefix=False)
return WSGIHandler()
2.4 wsgiref
app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
flask类的__call__方法
def __call__(self, environ: dict, start_response: t.Callable) -> t.Any:
return self.wsgi_app(environ, start_response)
wsgiref.py
纯手写web服务端
from wsgiref.simple_server import make_server
def mya(environ, start_response):
print(environ)
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__':
myserver = make_server('', 8011, mya)
print('监听8010')
myserver.serve_forever()
3.Werkzeug
Werkzeug是一个WSGI工具包(在它基础上,继续封装),可以作为一个Web框架的底层库。
werkzeug 不是一个web服务器,也不是一个web框架,而是一个工具包。
官方介绍说是一个 WSGI 工具包,它可以作为一个 Web 框架的底层库,因为它封装好了很多 Web 框架的东西,例如 Request,Response等
Werkzeug是基于wsgiref封装的
flask使用的就是基于它封装的
from werkzeug.wrappers import Request, Response
@Request.application
def hello(request):
return Response('Hello World!')
if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, hello)
4. wsgiref | wsgi | Werkzeug 关系
Django的web框架wsgiref基于wsgi封装
flask框架的web服务器Werkzeug基于wsgiref的再次封装
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9dfebe1b58a18dc95a7893189b196e34.png)