Python相关模块实现WSGI规则的案例
Posted 忘忆随风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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请求的文章
以上是关于Python相关模块实现WSGI规则的案例的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点#Python实战案例,pygame模块,Python实现套路表白神器VS无套路表白神器
#yyds干货盘点#Python实战案例,requests模块,Python实现获取动态图表