zoukankan      html  css  js  c++  java
  • python wsgi学习:PEP3333(笔记型文章)

    摘要

    用python做web开发,经常听到WSGI这个词,全称即:Python Web Server Gateway Interface 。wsgi是定义一套被提议的标准接品,该接口规范web servers(web服务器程序,如java领域的tomca)和python web applications或frameworks(基于python的web开发框架,如java领域的struts,springmvc等),目的就是增加基于python开发的web程序在不同web servers上可移植性。

    如果是做jee开发人员,可以把wsgi理解成java领域的servlet规范,它定义了一套标准接口用于规范各servlets容器厂商的统一接口,这样遵守servlets规范的java web程序或框架就能在各个不同的servlets厂商实现的容器中(如tomcat,jetty,weblogic)运行并呈现一致性。重点要记住一点,wsgi即不是web server,也不是framework,它只是一套规范两者必需遵守的接口定义,就像servelt规范即不是tomcat,也不是strusts一样的道理。类比理解这个关系,对于之前是java开发人员来说,很容易理解。

    WSGI规范概述

    WSGI接口涉及两个方面:一面是:服务器(server)或网关(gateway),相对别一面是:应用程序(application)或框架(framework)。服务端运行由应用程或框架提供的可执行的对像实例,至于这个可执行对象的是如果获得的细节,不在WSGI规范定义之内,而是同server或gataway去处理。

    相对于上面提到的两个方面(server和application),经常要引入一些中间件(middleware),这些中间件组件从不同的角度看其所起的角色作用也不同,相对server(服务器)来看,它像一个application(应用程序),而站在application的角度看middleware,它更像一个server逻辑在运行。java开发人员可以类比想象一件jee中的中间件,就知道怎么回事了。

    application/framework端

    application/framework端应该构建一个application对象实例,且该实例必需是可执行的,这里要注意的是:在python中一切皆对象,可执行的对象可以是函数,类,类实例(定义了__call__方法)。对于server/gateway接收到一次请求(request),理论上就应该调用运行一次application的处理方法。

    如下是一个简单的application定义:

    #applicaion.py
    
    def process(environ,start_response):
        status = '200 OK'
        response_headers = [('Content-type', 'text/plain')]
        start_response(status, response_headers) #server端实现逻辑
        return "Hello,World!"

    server/gateway端 

    #伪代码描述
    out = socket.outstream #客户端连接流
    
    def start_response(status,response_headers):
        #send 'status' and 'response_headers' 
        out.write(status,'\r\n')
        out.write(response_headers)
        
    
    def run_with_cgi(application):#接收application可执行对象
        result = application.process(environ,start_response)
        #write result to 'out' stream
        out.write(result)
        

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    Middleware(中间件),在上面提到的两端(application和server)都有角色扮演

    class xml_to_html:
        def __init__(application):
            self.application = application
            
        def process(environ,start_response):
            result = self.application(environ,start_response)
            result = xslTool.parse(result)
            return result
            
    def run_with_cgi(xml_to_html(application)):#接收被xml_to_html这个中间件包装过的application可执行对象
        #对于server和application来说,xml_to_html对两边的接口都是透明的

     

  • 相关阅读:
    软件测试理论基础
    使用Pycharm官方统计代码行插件统计代码总行数
    Jmeter的配置文件解析
    python异常整理
    python2与python3的区别
    tomcat的server.xml配置
    异常:Error response from daemon: conflict: unable to delete 6fa48e047721 (cannot be forced)
    前端 -- 定位和z-index
    前端 -- background
    前端 -- 超链接导航栏案例
  • 原文地址:https://www.cnblogs.com/jcli/p/2737898.html
Copyright © 2011-2022 走看看