Python web框架 | wsgiref | wsgi | Werkzeug

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
返回给浏览器做响应

在这里插入图片描述

2.3 wsgi

wsgi.py
import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'companion.settings.prod')
# http请求来了会执行get_wsgi_application(environ,start_response)
application = get_wsgi_application()
get_wsgi_application
import django
from django.core.handlers.wsgi import WSGIHandler

def get_wsgi_application():
# get_wsgi_application是 WSGIHandler类的对象
# 对象+()触发类的__call__方法
# 实际就是__call__(environ,start_response)
    django.setup(set_prefix=False)
    return WSGIHandler()

2.4 wsgiref

app.py
from flask import Flask

app = Flask(__name__)
# 请求来了会执行app()
# 传入参数environ, start_response
# 对象+()触发Flask类的__call__
@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):
# environ:http的请求转成python的字典
# 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)
    # 监听本地的8011端口,当请求来了,就会执行mya()
    # may:可调用的对象
    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)
    # 请求一旦进来就会调用可执行对象hello

4. wsgiref | wsgi | Werkzeug 关系

Django的web框架wsgiref基于wsgi封装

flask框架的web服务器Werkzeug基于wsgiref的再次封装

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值