首页 WSGI
文章
取消

WSGI

WSGI的概念和示例

WSGI代表Web服务器网关接口。它是Python用于连接Web服务器和Web应用程序(如Flask、Django等)的标准接口。WSGI定义了服务器和应用程序之间通信的规则和协议,使得不同的Web服务器和应用程序之间互通变得更容易。

简单来说,WSGI充当了一个中间人的角色,使得Web服务器和Web应用程序之间能够进行有效的通信。WSGI接口定义了一组回调函数和变量,Web服务器调用这些函数来向应用程序提供请求,应用程序则利用这些函数来生成响应。WSGI服务通常使用专用服务器(例如gunicorn、uwsgi等)来提供,而不是直接从Web服务器(例如Nginx或Apache)运行。

示例:

以下是一个简单的WSGI应用程序示例,由一个Python函数组成,它将HTTP请求作为参数并返回一个包含响应的字符串。

1
2
3
4
5
def application(environ, start_response):
    status = '200 OK'
    headers = [('Content-type', 'text/plain')]
    start_response(status, headers)
    return [b'Hello World']

这个Python函数带有两个参数:environstart_response。其中,environ是一个包含有关HTTP请求的元数据的字典。start_response是一个回调函数,用于向Web服务器提供HTTP响应头和状态代码。

为了将这个应用程序实现为WSGI服务,我们需要再编写一个HTTP服务器。这里我们使用Python标准库中的wsgiref模块,该模块实现了WSGI协议及其转换为HTTP协议的过程。

1
2
3
4
5
from wsgiref.simple_server import make_server

httpd = make_server('', 8000, application)
print("Serving on port 8000...")
httpd.serve_forever()

在上面的代码中,我们创建了一个HTTP服务器对象,并将其绑定在本地8000端口上。然后,我们使用serve_forever函数一直执行,直到程序被中断。

运行上述代码,将在本地启动服务,并监听在8000端口上。现在,我们可以在浏览器中访问http://localhost:8000,应该会看到显示“Hello World”的页面,这是由我们编写的WSGI应用程序生成的。

在上述的例子中,应用程序是指 application 函数,这是一个Python函数实现的Web应用程序。而Web服务器则是使用Python标准库中 wsgiref 模块提供的简单服务器。简单服务器是一个实现WSGI标准的HTTP服务器,可以作为Web应用程序的开发服务器或测试服务器使用。

通常情况下,Python Web应用程序的部署是通过一个专用的Web服务器实现。这个Web服务器可以是用Python编写的,也可以是使用其他编程语言或工具实现的。部署过程中,Web服务器接收来自Internet的连接,并将其转发到Web应用程序处理。而Web应用程序则根据请求生成响应,并将其发送回Web服务器,最终由Web服务器返回给客户端。

在Python Web开发中,一些流行的Web服务器包括:

  • Apache HTTP Server
  • Nginx
  • Gunicorn
  • uWSGI

这些服务器多数都支持WSGI协议,可以通过WSGI来连接Web服务器和Python Web应用程序。Python Web应用程序的实现通常使用一些Web框架,包括Flask、Django、Tornado、Bottle等,这些框架提供了一些函数或类到WSGI服务器,然后WSGI服务器通过协议和提供的函数最终连接到Python Web应用程序中,完成处理请求和响应的功能。

比如werkzeug中提供的run_simple函数,就是其中一种。

werkzeug的run_simple

werkzeug库中run_simple的用法和示例。

Werkzeug是一个WSGI工具库,它提供了许多用于构建Web应用程序的工具。其中,run_simple是Werkzeug库中的一个函数,它可以快速地启动一个简单的局域网应用程序服务器。

run_simple的常用语法如下:

1
run_simple(hostname, port, application, **options)

参数说明:

  • hostname:要监听的主机名,默认为127.0.0.1(本地主机)。
  • port:要监听的端口号,默认为5000。
  • application:WSGI应用程序对象,如Flask实例。
  • options:其他选项,如ssl_context(SSL上下文)、threaded(是否开启多线程)等。

示例:

假设我们有一个简单的Flask应用程序,代码如下:

1
2
3
4
5
6
7
8
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

我们可以使用run_simple函数来启动这个应用程序,并监听在端口号5000上,示例代码如下:

1
2
3
4
5
6
7
8
9
10
from werkzeug.serving import run_simple
from werkzeug.wsgi import Application

from myapp import app

application = Application(app)

if __name__ == '__main__':
    run_simple('localhost', 5000, application)

其中,我们将Flask应用程序封装在一个名为application的WSGI应用程序对象中,然后使用run_simple函数来启动服务器。如果我们将该代码保存到runserver.py文件中,可以在终端中使用下面的命令来启动应用程序:

1
2
$ python runserver.py

启动后,我们就可以在浏览器中访问http://localhost:5000/,看到显示Hello, World!的页面了。

本文由作者按照 CC BY 4.0 进行授权

Spring Boot

Web前端