WSGI

WSGI模型

在这里插入图片描述
WSGI(Web Server Gateway Interface) 主要规定了服务器端和应用程序间的接口。
解决服务与程序之间的交互。
分析
1、浏览器将HTTP请求发送给WSGI Server
2、由WSGI Server将请求解包、封装成environ
3、将封装好的environ和start_response函数,传递给WSGI APP逻辑处理
4、App返回的一个可迭代对象,可以被认作正文,后期经处理变成HTTP正文
5、WSGI Server接收start_response函数和App返回正文,并作为HTTP报文头、HTTP正文发送回游览器

WSGI服务器–wsgiref

wsgiref是Python提供的一个WSGI参考实现库,不适合生产环境
wsgiref.simple_server模块实现了一个简单的WSGI HTTP服务器

import wsgiref
from wsgiref.simple_server import make_server


def demo_app(environ,start_response):
    from io import StringIO
    # 内存虚拟文件
    stdout = StringIO()
    #写入文件
    print("Hello world!", file=stdout)
    print(file=stdout)
    h = sorted(environ.items())
    for k,v in h:
        print(k,'=',repr(v), file=stdout)
    start_response("200 OK", [('Content-Type','text/plain; charset=utf-8')])
    return [stdout.getvalue().encode("utf-8")]
ws=make_server('127.0.0.1',9999,demo_app)
ws.serve_forever()

在这里插入图片描述

from wsgiref.simple_server import make_server
from wsgiref.simple_server import demo_app

# demo_app应用程序,可调用
ws=make_server('127.0.0.1',9999,demo_app)
ws.serve_forever()#server.handle_request()执行一次

WSGI服务器作用:

  • 监听HTTP服务端口(TCPServer,默认端口80)
  • 接收浏览器端的HTTP请求并解析封装成environ环境数据
  • 负责调用应用程序,将environ数据和start_response方法两个实参传入给Application
  • 将应用程序响应的正文封装成HTTP响应报文返回游览器端
WSGI APP应用程序端

1、应用程序应该是一个可调用对象,Python中应该是函数、类、实现了__call__方法的类的实例
2、可调用对象接收2个参数


from wsgiref.simple_server import make_server
sample=b'123456'
def app(environ,start_response):
    start_response('200 ok', [('Content-Type', 'text/plain; charset=utf-8')])
    return [sample]
class App:
    def __init__(self,environ,start_response):
        self.en=environ
        self.start=start_response
    def __iter__(self):
        self.start('200 ok', [('Content-Type', 'text/plain; charset=utf-8')])
        yield  sample
class Application:
    def __call__(self, environ, start_response):
        start_response('200 OK', [('Content-Type', 'text/plain; charset=utf-8')])
        return [sample]

ws=make_server('127.0.0.1',9999,App)
ws.serve_forever()#server.handle_request()执行一次

environ
environ是包含Http请求信息的dict字典对象

名称含义
REQUEST_METHOD请求方法,GET、POST等
PATH_INFOURL中的路径部分
QUERY_STRING查询字符串
SERVER_NAME,SERVER_PORT服务器名、端口
HTTP_HOST地址和端口
SERVER_PROTOCOL协议
HTTP_USER_AGENTUserAgent信息

在这里插入图片描述
start_response

start_response(status, response_headers, exc_info=None)

在这里插入图片描述
start_response应该在返回可迭代对象之前调用,因为它返回的是Response Header。返回的可迭代对象是
Response Body。

WSGI WEB服务器

  • 本质上就是一个TCP服务器,监听在特定端口上
  • 支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器端
  • 实现了WSGI协议,该协议约定了和应用程序之间接口(参看PEP333,https://www.python.org/dev/peps/p
    ep-0333/)
    WSGI APP应用程序
  • 遵从WSGI协议
  • 本身是一个可调用对象
  • 调用start_response,返回响应头部
  • 返回包含正文的可迭代对象
    WSGI 框架库往往可以看做增强的更加复杂的Application。
WSGIPython Web Server Gateway Interface的缩写,是Python应用程序或框架和Web服务器之间的一种接口,用于在Web服务器上运行Python Web应用程序。在Windows上使用WSGI,可以通过以下步骤实现: 1.安装mod_wsgi模块:可以从官方网站(https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi)下载对应版本的mod_wsgi模块,然后使用pip进行安装。 2.配置Apache服务器:在httpd.conf文件中添加以下内容: ```apache LoadModule wsgi_module "C:/Python27/Lib/site-packages/mod_wsgi/server/mod_wsgi.pyd" WSGIScriptAlias /myapp "C:/path/to/myapp.wsgi" <Directory "C:/path/to"> Order allow,deny Allow from all </Directory> ``` 其中,第一行是加载mod_wsgi模块,第二行是指定WSGI应用程序的URL路径和WSGI文件的路径,第三至五行是指定WSGI文件所在目录的访问权限。 3.编写WSGI应用程序:创建一个名为myapp.wsgi的文件,编写WSGI应用程序的代码,例如: ```python def application(environ, start_response): status = '200 OK' output = 'Hello World!' response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output] ``` 其中,application函数是WSGI应用程序的入口,environ是一个包含HTTP请求信息的字典,start_response是一个回调函数,用于发送HTTP响应头,返回值是HTTP响应体。 4.启动Apache服务器:在命令行中输入httpd命令启动Apache服务器,然后在浏览器中访问http://localhost/myapp即可看到Hello World!的输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值