WSGI接口
来源:互联网 发布:闪电邮 mac 编辑:程序博客网 时间:2024/06/01 20:30
python教程 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
------------------------------------------------------------------------------------------------------------------
WSGI接口:Web Server Gateway Interface
Web应用的本质就是:
1.浏览器发送一个HTTP请求;
2.服务器收到请求,生成一个HTML文档;
3.服务器把HTML文档作为HTTP响应的Body发送给浏览器;
4.浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。
WSGI接口封装了实现TCP连接、HTTP原始请求和响应格式等的底层代码,让我们专心用Python编写Web业务。
==================================================================
def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>']
上面的application()
函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:
environ:一个包含所有HTTP请求信息的
dict
对象;start_response:一个发送HTTP响应的函数。
在application()
函数中,调用:
start_response('200 OK', [('Content-Type', 'text/html')])
就发送了HTTP响应的Header,注意Header只能发送一次,也就是只能调用一次start_response()
函数。start_response()
函数接收两个参数,一个是HTTP响应码,一个是一组list
表示的HTTP Header,每个Header用一个包含两个str
的tuple
表示。
通常情况下,都应该把Content-Type
头发送给浏览器。其他很多常用的HTTP Header也应该发送。
然后,函数的返回值b'<h1>Hello, web!</h1>'
将作为HTTP响应的Body发送给浏览器。
有了WSGI,我们关心的就是如何从environ
这个dict
对象拿到HTTP请求信息,然后构造HTML,通过start_response()
发送Header,最后返回Body。
整个application()
函数本身没有涉及到任何解析HTTP的部分,也就是说,底层代码不需要我们自己编写,我们只负责在更高层次上考虑如何响应请求就可以了。
不过,等等,这个application()
函数怎么调用?如果我们自己调用,两个参数environ
和start_response
我们没法提供,返回的bytes
也没法发给浏览器。
所以application()
函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器,我们可以挑选一个来用。但是现在,我们只想尽快测试一下我们编写的application()
函数真的可以把HTML输出到浏览器,所以,要赶紧找一个最简单的WSGI服务器,把我们的Web应用程序跑起来。
好消息是Python内置了一个WSGI服务器,这个模块叫wsgiref,它是用纯Python编写的WSGI服务器的参考实现。所谓“参考实现”是指该实现完全符合WSGI标准,但是不考虑任何运行效率,仅供开发和测试使用。
运行WSGI服务
我们先编写hello.py
,实现Web应用程序的WSGI处理函数:
# hello.pydef application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>']
然后,再编写一个server.py
,负责启动WSGI服务器,加载application()
函数:
# server.py# 从wsgiref模块导入:from wsgiref.simple_server import make_server# 导入我们自己编写的application函数:from hello import application# 创建一个服务器,IP地址为空,端口是8000,处理函数是application:httpd = make_server('', 8000, application)print('Serving HTTP on port 8000...')# 开始监听HTTP请求:httpd.serve_forever()
如果你觉得这个Web应用太简单了,可以稍微改造一下,从environ
里读取PATH_INFO
,这样可以显示更加动态的内容:
# hello.pydef application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) body = '<h1>Hello, %s!</h1>' % (environ['PATH_INFO'][1:] or 'web') return [body.encode('utf-8')]
你可以在地址栏输入用户名作为URL的一部分,将返回Hello, xxx!
小结
无论多么复杂的Web应用程序,入口都是一个WSGI处理函数。HTTP请求的所有输入信息都可以通过environ
获得,HTTP响应的输出都可以通过start_response()
加上函数返回值作为Body。
复杂的Web应用程序,光靠一个WSGI函数来处理还是太底层了,我们需要在WSGI之上再抽象出Web框架,进一步简化Web开发。
from wsgiref.simple_server import make_serverdef login(request): f = open('login.html', 'rb') data = f.read() f.close() return [data]def auth(request): print('())(()(',request) user_union,pwd_union=request.get('QUERY_STRING').split('&') _,user=user_union.split('=') _,pwd=pwd_union.split('=') if user == 'yuan' and pwd == '123': return [b'ok'] else: return [b'error']def foo1(request): f = open('egon.html', 'rb') data = f.read() f.close() return [data]def routers(): urlpattern=( ('/login',login), ('/egon',foo1), ('/auth',auth), ) return urlpatterndef application(environ,start_response): path = environ.get('PATH_INFO') print("path",path) start_response('200 ok',[('Content-type','text/html')]) urlpattern=routers() func=None for item in urlpattern: if path == item[0]: func=item[1] break if func: return func(environ) else: return [b'404']t=make_server('',8800,application)t.serve_forever()
- WSGI接口
- WSGI接口
- WSGI接口
- WSGI接口
- WSGI接口
- WSGI接口
- WSGI接口
- WSGI接口
- WSGI接口
- WSGI接口
- WSGI接口
- WSGI.应用接口
- web python -- WSGI接口
- Python WSGI接口
- WSGI: 应用接口
- python WSGI接口
- Python之WSGI接口
- wsgi接口开发
- 什么是SSO授权
- hdu6097 Mindis【圆的反演】
- 亲和串(KMP)
- 以路由器或者交换机作为相机连接端口的连接方式
- raid 3108 的初始化
- WSGI接口
- 第一章 Kotlin入门及环境配置
- Android 使用Java Mail发送邮件
- ES6 —(Promise)
- Java-程序运行时间(15)
- 配置_DruidDataSource参考配置
- Cause: null value in entry: UMENG_APPKEY=null 友盟统计
- 毕设系列之JrtpLib H264(裸视频数据) 实时视频传输(发送与接受)
- TechWorld2017热点回顾 | 当围棋大咖遇上网络安全精英:Google人工智能与机器学习探讨