WSGI是什么?

介绍

全称 Python Web Server Gateway Interface,指定了web服务器和Python web应用或web框架之间的标准接口,以提高web应用在一系列web服务器间的移植性。

从以上介绍我们可以看出:

  1. WSGI是一套接口标准协议/规范;
  2. 通信(作用)区间是Web服务器和Python Web应用程序之间;
  3. 目的是制定标准,以保证不同Web服务器可以和不同的Python程序之间相互通信

为什么需要WSGI?

首先,我们明确一下web应用处理请求的具体流程

  1. 用户操作操作浏览器发送请求
  2. 请求转发至对应的web服务器
  3. web服务器将请求转交给web应用程序,web应用程序处理请求
  4. web应用将请求结果返回给web服务器,由web服务器返回用户响应结果
  5. 浏览器收到响应,向用户展示

可以看到,请求时Web服务器需要和web应用程序进行通信,但是web服务器有很多种啊,Python web应用开发框架也对应多种啊,所以WSGI应运而生,定义了一套通信标准。试想一下,如果不统一标准的话,就会存在Web框架和Web服务器数据无法匹配的情况,那么开发就会受到限制,这显然不合理的。


WSGI的标准

web服务器在将请求转交给web应用程序之前,需要先将http报文转换为WSGI规定的格式。

WSGI规定,Web程序必须有一个可调用对象,且该可调用对象接收两个参数,返回一个可迭代对象:

  • environ:字典,包含请求的所有信息
  • start_response:在可调用对象中调用的函数,用来发起响应,参数包括状态码,headers等

实现简单的WSGI服务

首先,我们编写一个符合WSGI标准的一个http处理函数:

# client.py
def hello(environ, start_response):
    status = "200 OK"
    response_headers = [('Content-Type', 'text/html')]
    start_response(status, response_headers)
    path = environ['PATH_INFO'][1:] or 'hello'
    return [b'<h1> %s </h1>' % path.encode()]

该方法负责获取 environ 字典中的 path_info,也就是获取请求路径,然后在前端展示。

接下来,我们需要一个服务器启动WSGI服务器用来处理验证,使用Python内置的WSGI服务器模块 wsgiref,编写server.py:

# server.py
from wsgiref.simple_server import make_server
from client import hello


def main():
    server = make_server('localhost', 8001, hello)
    print('Serving HTTP on port 8001...')
    server.serve_forever()


if __name__ == '__main__':
    main()

执行 python server.py,浏览器打开 http://localhost:8001/a,即可验证。

通过实现一个简单的WSGI服务,我们可以看到:通过 environ 可以获取 http 请求的所有信息,http 响应的数据都可以通过 start_response 加上函数的返回值作为body。

当然,以上只是一个简单的案例,那么在python的Web框架内部是如何遵循WSGI规范的呢?以Flask举例,


Flask 与 WSGI

Flask 中的程序实例 app 就是一个可调用对象,我们创建 app 实例时所调用的Flask类实现了 __call 方法,__call 方法调用了 wsgi_app() 方法,该方法完成了请求和响应的处理,WSGI服务器通过调用该方法传入请求数据,获取返回数据:

def wsgi_app(self, environ, start_response):
    ctx = self.request_context(environ)
    error = None
    try:
        try:
            ctx.push()
            response = self.full_dispatch_request()
        except Exception as e:
            error = e
            response = self.handle_exception(e)
        except:  # noqa: B001
            error = sys.exc_info()[1]
            raise
        return response(environ, start_response)
    finally:
        if self.should_ignore_error(error):
            error = None
        ctx.auto_pop(error)

def __call__(self, environ, start_response):
    return self.wsgi_app(environ, start_response)
<think>好的,我需要回答用户关于uvicorn库的问题。首先,我得回忆一下uvicorn的相关知识。Uvicorn是一个ASGI服务器,用于运行异步Python web应用,比如使用FastAPI或Starlette框架构建的应用。ASGI代表异步服务器网关接口,是WSGI的继任者,支持异步操作。用户可能想知道uvicorn的主要功能、用途以及如何安装和使用。我需要详细说明这些点,并提供代码示例。比如,安装命令是`pip installuvicorn`,然后运行一个简单的应用可能需要创建一个main.py文件,使用FastAPI定义一个接口,然后用uvicorn命令启动服务器。 还要解释代码部分,比如FastAPI应用的结构,以及启动命令中各参数的意义,比如--host和--port。另外,可能需要提到uvicorn支持热重载,这在开发时很有用,通过--reload选项启用。 然后,用户可能希望了解与其他服务器的比较,比如Gunicorn。这里需要指出uvicorn通常与Gunicorn结合使用,特别是在生产环境中,Gunicorn作为进程管理器,而uvicorn作为工作进程来处理请求。 最后,按照要求,我需要提出相关问题。这些问题应该围绕uvicorn的特性、与其他工具的区别、配置选项以及部署最佳实践等方面。例如,ASGI和WSGI的区别,如何将uvicorn与Gunicorn结合使用,uvicorn的配置参数,以及生产环境部署注意事项等。总结一下,回答的结构应该是先介绍uvicorn是什么,然后详细说明其用途,给出安装和使用的代码示例,解释代码的关键部分,最后提出相关问题。确保回答准确、清晰,并且覆盖用户可能关心的各个方面。</think>Uvicorn 是一个基于ASGI(Asynchronous Server Gateway Interface)的轻量级超高性能Web服务器,专门用于运行异步Python Web应用程序。它支持HTTP/1.1和WebSockets协议,是部署FastAPI、Starlette等异步框架的首选服务器。 **典型使用场景**: - 部署FastAPI应用 - 运行需要异步处理的高并发服务 - 开发实时Web应用(WebSocket) - 需要高性能HTTP服务的场景 **示例代码(FastAPI应用)**: ```python # 安装依赖:pip install fastapi uvicorn from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"message": "Hello World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q} ``` **启动命令**: ```bash uvicorn main:app --host 0.0.0.0 --port 8000 --reload ``` **参数解释**: - `main:app`:模块名:应用实例 - `--host`:绑定地址(0.0.0.0允许外部访问) - `--port`:监听端口 - `--reload`:开发时自动重载(生产环境禁用) **关键特性**: 1. 支持ASGI最新规范 2. 基于uvloop和httptools的C扩展实现高性能 3. 自动处理请求/响应生命周期 4. 支持WebSocket协议 5. 兼容同步和异步请求处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值