zoukankan      html  css  js  c++  java
  • python wsgi

    什么是wsgi?

      wsgi是一个web组件的接口防范,wsgi将web组件分为三类:web服务器,web中间件,web应用程序 

      wsgi基本处理模式为:wsgi Server -> wsgi middleware -> wsgi application

    wsgi server:

      理解为一个符合wsgi规范的web server,接收request请求,封装一系列环境变量,按照wsgi规范调用注册的wsgi app,最后将response返回给客户端。

      工作流程:

        1、服务器创建socket,监听port,等待client 连接

        2、当请求过来时,server解析client msg放到环境变量environ中,并调用绑定的handler来处理

        3、handler解析这个http请求,将请求消息例如method、path等放到environ中

        4、wsgi handler再将一些server端消息也放到environ中,最后server msg,client msg,以及本次请求msg 全部都保存到了环境变量envrion中;

        5、wsgi handler调用注册的wsgi app,并将envrion和回调函数传给wsgi app

        6、wsgi app将reponse header/status/body回传给wsgi handler

        7、handler 通过socket将response msg返回到client

    WSGI Application

      wsgi application就是一个普通的callable对象,当有请求到来时,wsgi server会调用这个wsgi app。这个对象接收两个参数,通常为environ,start_response。environ就像前面介绍的,可以理解为环境变量,

      跟一次请求相关的所有信息都保存在了这个环境变量中,包括服务器信息,客户端信息,请求信息。start_response是一个callback函数,wsgi application通过调用start_response

      将response headers/status 返回给wsgi server。此外这个wsgi app会return 一个iterator对象 ,这个iterator就是response body。

    Dispatcher Middleware,用来实现URL 路由:(代码说明)

     1 #!/usr/bin/python 
     2 #encoding=utf-8
     3 
     4 #利用wsgiref 作为wsgi server
     5 from wsgiref.simple_server import make_server
     6 """
     7 def simple_app(environ, start_response):
     8     status = '200 ok'
     9     response_headers = [('Content-type', 'text/plain')]     #设置http头
    10     start_response(status, response_headers)
    11     return [u"test wsgi app".encode('utf-8')]
    12 
    13 class AppClass(object):
    14     def __call__(self, environ, start_response):
    15         status = "200 ok"
    16         response_headers = [('Content-type', 'text/plain')]
    17         start_response(status, response_headers)
    18         return [u"class AppClass".encode('utf-8')]
    19 """
    20 
    21 #wsgi app只要是一个callable对象即可,不一定要是函数
    22 #一个实现了__call__方法示例也ok的
    23 
    24 #httpd = make_server('', 8080, simple_app)
    25 """
    26 app = AppClass()
    27 httpd = make_server('', 8080, app)
    28 httpd.serve_forever()
    29 """
    30 URL_PATTERNS = (
    31         ('AA/', 'AA_app'),
    32         ('BB/', 'BB_app'),
    33         )
    34 
    35 class Dispatcher(object):
    36     #实现路由功能:
    37     def _match(self, path):
    38         path = path.split('/')[1]
    39         for url, app in URL_PATTERNS:
    40             if path in url:
    41                 return app
    42 
    43     def __call__(self, environ, start_response):
    44         path = environ.get('PATH_INFO', '/')
    45         app = self._match(path)
    46         if app:
    47             app = globals()[app]
    48             return app(environ, start_response)
    49         else:
    50             start_response("404 NOT FOUND",[('Content-type', 'text/plain')])
    51             return ["page dose not exists"]
    52 
    53 def AA_app(environ, start_response):
    54     start_response("200 OK",[('Content-type', 'text/html')])
    55     return ["AA page"]
    56 
    57 def BB_app(environ, start_response):
    58     start_response("200 OK",[('Content-type', 'text/html')])
    59      return ["BB page"]
    60 
    61 app = Dispatcher()
    62 httpd = make_server('', 8090, app)
    63 httpd.serve_forever()
    64 
    65 测试结果:
    66 server端:
    67 root@u163:~/cp163/python# python wsgi_app.py 
    68 192.168.2.162 - - [04/Nov/2015 18:44:06] "GET /AA HTTP/1.1" 200 7
    69 192.168.2.162 - - [04/Nov/2015 18:44:22] "GET /BB HTTP/1.1" 200 7
    70 
    71 client端:
    72 root@u162:~# curl http://192.168.2.163:8090/AA
    73 AA page
    74 root@u162:~# curl http://192.168.2.163:8090/BB
    75 BB page
    76 root@u162:~# 

    上述示例是wsgi application的一个简单模型;

    openstack中的wsgi application会涉及到几个比较重要的python 库

    1. eventlet.wsgi
    2. paste.deploy
    3. routes
    4. webob
    5. wsgiref.simple_server

    开发一个OpenStack 风格的WSGI APP原型需要完成的几方面的工作:

      从配置文件中找到WSGI APP程序启动的入口,例如nova的api-paste.ini文件。 在/etc/nova/api-paste.ini 

      定义好APP需要操作的资源,这儿我们主要是app的版本资源。

      完成好url到资源的映射。

     

       

  • 相关阅读:
    界面控件DevExpress WPF入门 表达式编辑器功能
    Telerik UI for WPF全新版本——拥有Office2019高对比度主题
    DevExpress报表控件v21.2 全新的Visual Studio报表设计器
    报告生成器FastReport .NET入门指南 在Linux中启动应用程序
    文档控件DevExpress Office File API v21.2 自定义字体加载引擎
    UI组件库Kendo UI for Angular入门 如何开始使用图表功能
    WPF界面工具Telerik UI for WPF入门级教程 设置一个主题(二)
    DevExtreme初级入门教程(React篇) TypeScript支持
    报表开发利器FastReport .NET v2022.1 添加关键对象和属性
    python项目打包(一) setup.py、Python源代码项目结构
  • 原文地址:https://www.cnblogs.com/chris-cp/p/4938522.html
Copyright © 2011-2022 走看看