Python相关模块实现WSGI规则的案例

最近学习了有关WSGI规则,分享一个简单实现的该规则的案例,也为了巩固一下所学的知识。

1. WSGI接口规则的定义

WSGI接口规则定义非常简单,它只要求开发者在开发Web应用时实现一个统一名称的函数(即application())就可以响应HTTP请求了。

application()函数就是符合WSGI规则的一个HTTP处理函数,它接收两个参数:

evironment 这是一个包含所有HTTP请求信息的dict对象,语法格式为{key1:value1,key2:value2,...}
response 这是一个开始响应HTTP请求的函数(响应头、响应行)。

需要注意的是,application()函数的返回值会影响body体内容。

整个application()函数本身没有涉及到任何解析HTTP的内容,即把底层Web服务器解析部分和应用程序逻辑部分进行了分离,这样开发者就可以专心处理body体内容的部分。

def application(environ,start_response):
    start_response(status,response_headers)
    return [response_body]

2. 遵循wsgi写一个python框架

        2.1 wsgiref模块创建服务

        wsgiref是Python标准库的一个模块,是对WSGI的一个实现。其中wsgiref.simple_server是一个简单的WSGI HTTP Server。

from wsgiref import simple_server

def hello_app():
    # 此函数中返回数据给客户端
    pass

# make_server()创建服务
server = simple_server.make_server('localhost', 9000, hello_app)
print('running...')
# serve_forever()开启服务
server.serve_forever()

        2.2 处理web请求和响应

        使用webob模块封装的Request和Response来处理请求和响应

Request封装environ,Response返回响应体

from wsgiref import simple_server
from webob import Request,Response

def hello_app(environ,start_reponse):
    # environ-->客户端访问服务器发送的请求信息
    # 将请求信息按行进行处理
    req=Request(environ)
    # body='hello world'-->就是服务器发送给客户端的信息
    response=Response(body='hello world')
    # 输出,根据wsgi协议,返回的需要是一个迭代器,返回一个list就可以
    return response(environ,start_reponse)

#创建服务
server=simple_server.make_server('',8004,hello_app)
#启动服务
server.serve_forever()

        2.3 路由分发

        使用selector模块进行路由分发

可以到GitHub - lukearno/selector: WSGI request delegation. (AKA routing.)查看更多selector模块的相关操作

from wsgiref import simple_server
from webob import Request,Response
from selector import Selector

# '/'
def hello_app(environ,start_reponse):
    # 将请求信息按行进行处理
    req = Request(environ)
    response = Response(body='hello world')
    return response(environ,start_reponse)

# '/cart'
def cart_app(environ,start_reponse):
    response = Response(body='cart page')
    return response(environ, start_reponse)

# 自定义 404 页面
def page404(environ,start_reponse):
    response = Response(body='404 not found')
    return response(environ, start_reponse)

# 路由分发 - selector
app = Selector()
# 实现GET请求
app.add('/cart',GET=cart_app)
app.add('/',GET=hello_app)
# 如果他请求了一个非法的路径-404
app.status404 = page404

# 创建服务
server = simple_server.make_server('',8004,app)
print("web server is listening at 8004......")
# 启动服务
server.serve_forever()

到这里就实现了使用wegiref、webob、selector模块实现一个遵循WSGI规则的简单框架。

后续会出关于selector模块实现路由传参、获取访问的参数、静态资源加载以及实现POST请求的文章

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>