设为首页 收藏本站
查看: 865|回复: 0

[经验分享] Python-WSGI详解汇总

[复制链接]

尚未签到

发表于 2015-12-2 09:24:06 | 显示全部楼层 |阅读模式
  WSGI是什么
WSGI(Web Server Gateway Interface)是一种规范
参见PEP 333 http://www.python.org/dev/peps/pep-0333/

DSC0000.png
WSGI Server有哪些
比如 Django、CherryPy 都自带 WSGI server 主要是测试用途, 发布时则使用生产环境的 WSGI server
而有些 WSGI 下的框架比如 pylons、bfg 等, 自己不实现 WSGI server。使用 paste 作为 WSGI server
CherryPy's WSGI server.

wsgi有两方,服务器方 和 应用程序
  ①服务器方:其调用应用程序,给应用程序提供(环境信息)和(回调函数), 这个回调函数是用来将应用程序设置的http header和status等信息传递给服务器方.
  
②应用程序:用来生成返回的header,body和status,以便返回给服务器方。
       用Python语言写的一个符合WSGI的“Hello World”应用程序如下所示:





def app(environ, start_response):
     start_response('200 OK', [('Content-Type', 'text/plain')])
     yield "Hello world!\n"
  其中


  • 第一行定义了一个名为app的应用程序,接受两个参数,environ和 start_response,environ是一个字典包含了CGI中的环境变量,start_response也是一个callable,接受两个必 须的参数,status(HTTP状态)和response_headers(响应消息的头)。
  • 第二行调用了start_response,状态指定为“200 OK”,消息头指定为内容类型是“text/plain”
  • 第三行将响应消息的消息体返回。




   那通俗点来将的话:

wsgi中的服务器方:我们可以理解成是webserver,当然这个webserver可以是外置的,比如lighttpd,也可以是python自己写的。

而应用程序说白了就是:请求的统一入口!所有的请求都进入到这个app中来处理! 这个app说白了就是一个函数!!(类中的__call__是一样的道理)  
Python自带的 wsgiref
WSGI application
一个接口与两个参数
application(environ, start_response)
Demo
[python] view plaincopy
    #! /usr/bin/env python  
    # Our tutorial's WSGI server  
    from wsgiref.simple_server import make_server  
    def application(environ, start_response):  
       # Sorting and stringifying the environment key, value pairs  
       response_body = ['%s: %s' % (key, value)  
                        for key, value in sorted(environ.items())]  
       response_body = '\n'.join(response_body)  
       status = '200 OK'  
       response_headers = [('Content-Type', 'text/plain'),  
                      ('Content-Length', str(len(response_body)))]  
       start_response(status, response_headers)  
       return [response_body]  
    # Instantiate the WSGI server.  
    # It will receive the request, pass it to the application  
    # and send the application's response to the client  
    httpd = make_server(  
       'localhost', # The host name.  
       8051, # A port number where to wait for the request.  
       application # Our application object name, in this case a function.  
       )  
    httpd.serve_forever()  

wsgiref的simple_server说明
server的主要作用是接受client的请求,並把的收到的请求交給RequestHandlerClass处理,
RequestHandlerClass处理完成后回传结果给client
WSGIServer继承关系
WSGIServer-->HTTPServer-->SocketServer.TCPServer-->BaseServer
主要处理流程
serve_forever
  _handle_request_noblock()
    process_request
      finish_request--> RequestHandlerClass()
      close_request
serve_forever循环接受client请求, 如果有请求来,
经finish_request方法把请求交给RequestHandlerClass处理,
RequestHandlerClass调用handle()方法处理request,
WSGIRequestHandler的handle()方法把request又交給ServerHandler处理,
ServerHandler调用run執行application方法, 回传网页的结果(含http header及网页内容)给client
WSGIRequestHandler继承关系
WSGIRequestHandler-->BaseHTTPRequestHandler-->StreamRequestHandler-->BaseRequestHandler
BaseRequestHandler主要方法及处理流程
1、setup()
2、handle()
3、finish()
WSGIRequestHandler主要方法及处理流程
1、get_environ 增加env
2、handle (override)
        handler = ServerHandler
        handler.run(self.server.get_app())
ServerHandler继承关系
ServerHandler-->SimpleHandler-->BaseHandler
run方法
  setup_environ
  self.result = application(self.environ, self.start_response)
  self.finish_response

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146145-1-1.html 上篇帖子: 初识python之 APP store排行榜 蜘蛛抓取(三) 下篇帖子: 简单的贝叶斯分类器的python实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表