wsgi是什么

来源:互联网 发布:好喝的白酒推荐知乎 编辑:程序博客网 时间:2024/05/29 16:26
WSGI是什么?摸索了一两个月还没怎么弄清楚。之所以没弄清楚,不在于WSGI有多复杂,
而是目前基于WSGI的框架(如Django)和应用服务(如openstack)过于复杂。再加上它们
使用一些辅助的Lib库(如Route,webob,eventlet等)使得学习起来有点过于繁杂。本能的
好奇,使得在看代码时,碰到一个不懂的类库,不懂的函数都无法继续,想一探究竟。然而
这种好奇却给了懒惰一个的很好的接口,每当碰到不懂的函数时,会去找相关的文档,一般是
英文的,看一会不懂,看中文的,有点懂,然后发呆,不知道干嘛。。。再然后就可以回去吃
饭睡觉了。。。
好了,还是回到主题吧!
WSGI是Python在处理HTTP请求时,规定的一种处理方式。如一个HTTP Request过来了,那
么就有一个相应的处理函数来进行处理和返回结果。WSGI就是规定这个处理函数的参数长啥
样的,它的返回结果是长啥样的?至于该处理函数的名子和处理逻辑是啥样的,那无所谓。简单
而言,WSGI就是规定了处理函数的输入和输出格式。
WSGI不涉及任何网络服务器的实现,只规定了处理函数的实现,这里的处理函数也就是server上
的application。
python自带库中提供了一个简单的WSGI server,可以用来体验下WSGI应用的格式:
1 #!/usr/bin/env python
2
3
4 from wsgiref.simple_server import make_server
5 #规定参数第一个为environ,此为server传过来的,包含所有request相关的信息。start_response
#是server传的函数,用于返回status和headers。
6 def hello_world_app(environ, start_response):
7 status = '200 OK'
8 headers = [('Content-type', 'text/plain')]
9 print environ
10 start_response(status,headers) #调用以返回status和headers
11 #规定返回结果为list类型
12 return ["hello world"]
13
14 httpd = make_server('',#listen ip
15 8000,#listen port
16 hello_world_app)#appilication name
17
18 print "Serving on port 8000..."
19 httpd.serve_forever()

运行该脚本,用浏览器访问localhost:8000就可以得到hello world了。


environ是一个dict,但是wsgi是否规定environ必须存放哪些字段,我们应该怎样使用environ呢?
start_response是一个函数,这个函数它是怎么与server交互的呢?
0 0