授人以鱼不如授人以渔! 授人以鱼只救一时之急, 授人以渔则可解一生之需。(这也是俺博客的宗旨)

WSGI 和他的小伙伴们(一)

IT,Python 2017-05-28 浏览量: 2018 字数统计: 2796 最后更新: 2017-05-28 00:42

文章目录[显示]

俺这个 不经常与 Web 打交道的 银,突然让俺上手Web项目还有些 不适应,但是人都是有好奇心的嘛,而且 经常听大家说自己 开发的 网站用什么什么语言啊 ,有什么什么样子的功能啊 ,在俺看来,也算是 特别神圣的一件事情,恰好现在有时间在研究 Web 的项目,也好看看 外面的世界(当然是只 对于俺来说是外面的世界 啦 ~),于是就有了这个扫盲级别的 文章。有问题 一定要给俺提出来哦,毕竟俺在这是个新手 ~ 别误导了大家

好吧,咱也废话少说 言归正传
为了避免 对某些 知识的错误理解,以及为了后续的文章做铺垫,咱 在说 WSGI 之前 先 说几个常见知识 介绍,对俺来说也算是 扫盲了


什么是Web服务器

首先 Web服务器 有两个意思

  1. 一台负责提供网页的电脑,主要是各种编程语言构建而成,通过HTTP协议传给客户端(一般是指网页浏览器)。
  2. 一个提供网页的服务器程序。

咱们 接下来 提到的 Web服务器不是 负责提供网页的某一个 或多个 机器 ,也就是说不是上面 的第一个意思,这里提到的是指 第二个意思 ,专门提供 网页的服务器程序 ,功能大概就是 接受来自用户的请求,解析 HTTP 协议,然后转发给 请求的人 也可以是 一个 应用程序,回复的类型就多了,像纯文本文件,图像,音频,HTML 文件等等。

目前 互联网上 最常用的Web 服务器是 Apache 、Nginx、IIS、GWS


什么是 Web应用程序

Web应用程序是一种可以通过Web访问的应用程序。Web应用程序有一个最大的好处就是用户只需要有浏览器,不需要再安装其他软件。其中 Web 应用程序继承了 应用程序的一些特点,又有自己独特的魅力,并且 一般都是 B/S 架构,顾名思义 也就是 Browser/Server (浏览器/服务器 )架构,也就是基本上 都是借助 浏览器来 运行。
而 这个应用程序主要负责 处理用户的请求,并将处理的结果返回给 Web Server,最终 Web Server 将结果返回给用户。

再其他的 就不多 说了吧 ,毕竟大家 接触的 应该都挺多的 ~


什么 是Web 框架

首先先说说为什么会有Web 框架

WSGI 定义的 规范接口是一种低级的接口,所以如果直接使用 低级接口 的话,会使编程越来越麻烦,也难于维护,说白了,就是难用。所以 这肯定也是不行的,于是就出现了 Web 框架,所以也就是说Web 框架是在WSGI 等协议 封装 之上的一种 更好使用的 工具,或者是 Web 框架就是封装了 WSGI 等一些协议,不同的框架 封装的方法可能不一样。

然后在说什么是Web框架

> 一种软件的框架,用来支持动态网站、网络应用程序及网络服务的开发。这种框架有助于减轻网页开发时共通性活动的工作负荷,而且 许多框架都会提供一些基本的功能 用来 提升代码的可再用性,比如说

  • URL 的匹配和路由转发
  • Request/Response 的封装
  • session 管理(会话管理)
  • 标准 模板支持
  • 数据库访问
  • Admin 后台管理的支持
  • Form 表单对象
  • 错误、异常的处理

举一些常见框架的例子吧:

Python的 Web应用框架包括 django,flask,web2py,Tornado,pinax,Pylons 等等
JS的有 jQuery,AngularJS 等
JAVA的 有Spring 等 (别的也没听过 )
像Ruby 红宝石 有 著名的 Ruby On Rails


什么 是 MVC 结构

MVC(Model view controller)译为 (模型 - 视图 - 控制器 )
许多框架遵循模型 - 视图 - 控制器(MVC)体系模型的结构模式,使数据模型与用户界面分开。这被普遍认为是一个很好的做法,因为它模块化的代码,能提高代码的重复使用,并允许多个接口。在Web应用中,这允许不同的应用方面,如网页,远程应用程序和Web服务接口。MVC是业界比较认可的架构模型。

  • 控制器(Controller)- 负责转发请求,对请求进行处理。
  • 视图(View) - 界面设计人员进行图形界面设计。
  • 模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

像Python 框架 MVC 架构的 比较常用的 就是 Django 、TurboGears等了。
当然了,像MVC这么抽象的东西,可能也不是一句两句的 文字解释 就能够说明白的,所以,今儿 在这里咱就是为了介绍 它才介绍的它,等以后如果有机会能够更好的 接触这玩意儿 ,再好好介绍介绍。毕竟现在俺也 不是特别了解这个,不敢瞎写。

然后 咱们 在捋捋 顺序

首先Web 服务器调用 Web应用程序的代码,如果 有框架在 ,那么就是先调用 Web框架 的代码 喽

好 有了上面的这些 “名词解释 ”做铺垫,咱们就能顺利的进入 今儿 的正题 WSGI

但是在说WSGI 之前 ,俺 还想 提一个很重要的东西就是 CGI


什么是CGI

CGI ( Common Gateway Interface)通用网关接口 , 是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服务器和请求处理程序之间传输数据的一种标准。

看了上面这句话,你可能会说了,这TM 是啥,你在逗我么,下面咱们来 简单的 介绍一下,俺也尽量说的 能让人听得懂

  • 首先,咱 必须明确 一点,这个CGI 是一种通信协议,正常情况下用户发送了一个请求,首先 Web 服务器去解析这个 请求,然后CGI 会把所有的数据转换成 类似 k-v (键值对 )的形式 ,也就是说的环境变量,So 规定了一个数据传输的标准 。

了解 CGI 是为了咱们 了解WSGI 做的一个好的铺垫


什么是WSGI

其实前面的那些介绍,说有用也有用,说没用也没用,重在理解,毕竟俺说的 细碎.

下面就是摘自维基百科上面的介绍

Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器 和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。

其中 WSGI参考了CGI的设计,对CGI的设计思想进行了进一步封装。

这个接口是怎么来的

在WSGI出现之前, Web应用框架的选择将限制可用的Web服务器的选择
比如说咱需要 写一个 服务,俺 选 了某一个 Web 服务器 或 网关,于是 俺 就必须选择某一个特定的框架 或 应用程序(但是Web框架和Web应用程序是两个东西 ),同理 要是 选择了某一个框架,那么俺 就必须使用某一个 Web服务器,如果想要使用别的框架或者Web 服务器 肯定是不行滴,所以这种不兼容,就给大多数的程序员带来了很大的麻烦,而WSGI 就提供了一个接口,用来统一 Web 服务器和Web框架 之间的一个约定。

WSGI 是干嘛的

Python 通过WSGI约定了Web服务器或者是 网关 怎么调用Web
应用程序的代码 ,Web应用程序或 网关 需要符合什么样的规范,只要Web应用程序 和Web服务器 或者是网关都遵守WSGI 协议,那么 ,Web应用程序 和Web服务器或者 网关 就可以随意的组合。

听上去可能有些混乱,那咱 简化一下

Python 通过WSGI约定了Web服务器怎么调用Web
应用程序的代码,Web应用程序需要符合什么样的规范,只要Web应用程序
和Web 服务器都遵守WSGI 协议,那么,Web应用程序和web服务器就可以
随意的组合。相当于统一了Web 应用程序和 Web 服务器的一个接口。

WSGI 工作原理

从俺上面说的 部分,大概能够 了解 了一些关于WSGI的 东西,当然啦,如果还没了解也没关系,可能是俺 语言表达能力有问题,等有机会,俺会修正一下上面 比较蹩脚的话,尽量通俗易懂点。

好言归正传,说白了 WSGI 就是 相当于是Web 服务器和 Python 应用程序之间的一个 桥梁。而这个桥梁的作用就是 让Web服务器知道应该怎么去 调用Python的 应用程序,并且把用户的请求告诉应用程序,以及怎么把结果返回给 Web 服务器。

WSGI 标准

WSGI大致可以划分为两个部分,一个是“服务器”或“网关”,另一个是“应用程序”。在处理一个WSGI请求时,服务器会为应用程序提供环境信息及一个回调函数(Callback Function)。当应用程序完成处理请求后,通过前述的回调函数,将结果回传给服务器。

这么说有些 专业化,咱们举个例子 来解释一下

例子

下面咱就来运行 一个 跟 WSGI 匹配的 Function,如下

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from eventlet import wsgi
import eventlet

__author__ = "lmy"


def app_example(environ, start_response):
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return ['Hello, World!']


# 当然看也可以直接把状态码写到里面,官网就是这么写的
# def app_example(environ, start_response):
#     start_response('200 OK', [('Content-Type', 'text/plain')])
#     return ['Hello, World!']

# 启动一个HTTP服务,监听端口为8000
wsgi.server(eventlet.listen(('127.0.0.1', 8000)), app_example)
  • 首先 定义一个函数 叫app_example,这个函数 接受两个参数,environ和start_response,environ是一个字典包含了CGI中的环境变量,start_response也是一个函数 ,并且接受两个必须的参数,status(HTTP状态)和response_headers(响应消息的头)。
  • 然后调用start_response函数 ,状态指定为“200 OK”,消息头指定为内容类型是“text/plain”也就是个文本 ,接下来 返回 文本的内容“Hello, World!”
  • 最后 eventlet.wsgi.server 调用 app_example 函数时,会自动传入environ和
    start_response这两个参数,并且 能够 接受app_example 函数的返回值。

浏览器访问即可

2017-05-26 22-03-07屏幕截图.png

在这个例子中 app_example 就 相当于 “apllication”也就是 应用程序,而 app_example 函数接受的参数、返回 值的形式, 都是由WSGI约定的,这也就是WSGI 在这里面起到的作用。

抛开 咱们上面提到的例子,站在大的层面来说 WSGI 就是 是把 一些 跟HTTP 服务相关的 参数 封装为request对象并且 传递给应用程序 里面的 Function 对象并且能够解析 传出的response参数。所以 如果要使用 WSGI 的话,就需要 有Server 端和 Application 端,一般 Python的框架实现的是 Application端,但是有一些框架内部运行的时候会有一个默认的 Server端,但是实际上线配置的都是单独的 Web server 端,这个俺会在下面的文章中继续介绍,以及 WSGI 的两个干兄弟 uwsgi 和 uWSGI


注意

  • WSGI 不是API,不是服务器,也不是Python模块,更不是什么框架,而是一种服务器和客户端交互的接口规范
  • WSGI 是一种 协议。

参考资料

  1. https://zh.wikipedia.org/wiki/Web%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%BD%91%E5%85%B3%E6%8E%A5%E5%8F%A3
  2. https://zh.wikipedia.org/wiki/%E7%B6%B2%E9%A0%81%E4%BC%BA%E6%9C%8D%E5%99%A8
  3. https://zh.wikipedia.org/wiki/Web%E5%BA%94%E7%94%A8%E6%A1%86%E6%9E%B6
  4. https://zh.wikipedia.org/wiki/MVC
小蜗牛 说:
Freedom is the source from which all meaning and all values spring .


文章版权归 原文作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权| 转载必须包含本声明,并以超链接形式注明原文作者和本文原始地址: https://www.tougetu.com/2017/05/python-WSGI-1.html

3 条评论

  1. 小土豆

    我看到Nginx和CGI以为你会说如何配置FastCGI..而且CGI这个概念挺抽象的。看完我是懵了…咱说,Web服务器只能处理静态内容(JS, html, jpg, png,css等等),遇到动态文件比如说index.php,
    index.jsp 他就把这个文件简单处理之后交给FastCGI配置项中的程序,该交给这个程序啥(URL, header等),以什么格交给他,这个程序该返回啥什么格式,CGI就是规定以什么格式传递什么数据的一个协议。
    再多说一句,FastCGI就是用来提高CGI性能的,基本上模式是常驻一个master初始化设置啊啥的,任务来了启动worker,任务没了关闭worker,对于PHP来说就是php-fpm了~要不传统的CGI要每个请求都初始化。

    1. 小蜗牛

      你不说PHP还好,你一说我也蒙了…

  2. Benny小土豆

    对于 PHP 来说就是 php-fpm 了~,忽略这一句表情系统又发现一个bug,一会处理

添加新评论

代码 Pastebin Gist 加粗 删除线 斜体 链接 签到