文档章节

深入理解 Python WSGI:一起写一个 Web 服务器

大数据之路
 大数据之路
发布于 2015/08/03 00:55
字数 1274
阅读 1.3W
收藏 46

导读:

本系列深入浅出的讲述了如何用 Python 从 0 开始,写一个 web 服务器,并让其与业界流行的 web 框架协同工作,最后还进一步完善了开头的 web 服务器 demo,让其可以支持多并发请求的处理,并解决了过程当中遇到的“僵尸进程”等一系列 socket/网络编程 中的常见问题,图文并茂、循序渐进,是篇非常不错的教程,对了解整个 Web 编程理论相当有帮助,推荐一看。

作者:伯乐在线 - 高世界 翻译

1、什么是 Web 服务器,以及怎样工作的?

看问题要看到本质:从Web服务器说起

http://bit.ly/2N1iiTs

一起写一个 Web 服务器(1)

http://python.jobbole.com/81524/

Let’s Build A Web Server. Part 1.

http://ruslanspivak.com/lsbaws-part1/

2、Web 服务器和 Web 框架如何通过 WSGI 协同工作?

一起写一个 Web 服务器(2)

http://python.jobbole.com/81523/

Let’s Build A Web Server. Part 2.

http://ruslanspivak.com/lsbaws-part2/

花了两个星期,我终于把 WSGI 整明白了

https://zhuanlan.zhihu.com/p/68676316

3、Web 服务器如何处理并发请求?

一起写一个Web服务器(3)

http://python.jobbole.com/81820/

Let’s Build A Web Server. Part 3.

http://ruslanspivak.com/lsbaws-part3/

4、从0到1,Python Web开发的进击之路

https://zhuanlan.zhihu.com/p/25038203

5、flask 源码解析:应用启动流程

http://bit.ly/2n1fyaT

所有的 python web 框架都要遵循 WSGI 协议,如果对 WSGI 不清楚,可以查看《python wsgi 简介》。

在这里还是要简单回顾一下 WSGI 的核心概念。

WSGI 中有一个非常重要的概念:每个 python web 应用都是一个可调用(callable)的对象。在 flask 中,这个对象就是 app = Flask(__name__) 创建出来的 app,就是下图中的绿色 Application 部分。要运行 web 应用,必须有 web server,比如我们熟悉的 apache、nginx ,或者 python 中的 gunicorn ,我们下面要讲到的 werkzeug 提供的 WSGIServer,它们是下图的黄色 Server 部分。

The Python WSGI server-application interface.

图片来源(https://www.toptal.com/python/pythons-wsgi-server-application-interface)

Server 和 Application 之间怎么通信,就是 WSGI 的功能。它规定了 app(environ, start_response) 的接口,server 会调用 application,并传给它两个参数:environ 包含了请求的所有信息,start_response 是 application 处理完之后需要调用的函数,参数是状态码、响应头部还有错误信息。

WSGI application 非常重要的特点是:它是可以嵌套的。换句话说,我可以写个 application,它做的事情就是调用另外一个 application,然后再返回(类似一个 proxy)。一般来说,嵌套的最后一层是业务应用,中间就是 middleware。这样的好处是,可以解耦业务逻辑和其他功能,比如限流、认证、序列化等都实现成不同的中间层,不同的中间层和业务逻辑是不相关的,可以独立维护;而且用户也可以动态地组合不同的中间层来满足不同的需求。

6、推荐阅读

[1] Python HOWTO 官方文档:Socket 编程

http://python.jobbole.com/81860/

[2] Python Realtime

http://pyzh.readthedocs.org/en/latest/python-realtime.html

[3] 作为一个python开发者需要知道的关于服务器的知识

http://python.jobbole.com/82009/

[4] 理解Python WSGI

http://www.letiantian.me/2015-09-10-understand-python-wsgi/

[5] 专题:浅入浅出Flask框架

http://www.letiantian.me/topic-learn-flask/

[6] 用Python写一个简单的Web框架

http://python.jobbole.com/83817/

[7] 深入理解异步Web服务器 Tornado

http://python.jobbole.com/83826/

[8] flask route设计思路

http://segmentfault.com/a/1190000004213652

[9] Python微框架Flask源码剖析

http://bit.ly/2c7XvXO

[10] flask 源码解析:应用启动流程

http://bit.ly/2n1fyaT

 

5、关于 wsgi 问题集锦

问题:nginx<--->fstcgi<--->wsgi(flup)<--->web.py/Flask/Django这个模式是nginx和python的web网页的工作模式吗?

    Flup 通常不是生产环境选择,Gunicorn,uwsgi + nginx 和 Tornado 是几种常见方案吧。

[1] nginx<--->fstcgi<--->wsgi(flup)<--->web.py这个模式是nginx和python的web网页的工作模式吗?

http://www.zhihu.com/question/20221856

[2] 全面解读python web 程序的9种部署方式

http://lutaf.com/141.htm

[3] 深入理解 Python WSGI fastcgi

http://www.cnblogs.com/babykick/archive/2012/01/20/2328047.html

[4] 在Mac上使用Nginx和FastCGI部署Flask应用

    http://segmentfault.com/a/1190000002652109

    nginx上用fastcgi配置python环境(一)  

    http://blog.163.com/sky20081816@126/blog/static/1647610232010824262695/

[5] 基于nginx和uWSGI在Ubuntu上部署Django

    http://www.jianshu.com/p/e6ff4a28ab5a

    快速部署Python应用:Nginx+uWSGI配置详解

    http://developer.51cto.com/art/201010/229615_all.htm

[6] 高性能框架gevent和gunicorn在web上的应用及性能测试

    http://rfyiamcool.blog.51cto.com/1030776/1276364

    Gunicorn快速入门

    http://www.cnblogs.com/ArtsCrafts/p/gunicorn.html

[7] gunicorn, uwsgi, fast-cgi, tornado 等等,大家一般都用哪个做 server ?

http://python-china.org/t/100

[8] 在生产系统使用Tornado WebServer来代替FastCGI加速你的Django应用

    http://www.cnblogs.com/Alexander-Lee/archive/2011/05/02/tornado_host_django.html

    Tornado 中文文档

    http://www.tornadoweb.cn/documentation

 

 

© 著作权归作者所有

大数据之路
粉丝 1624
博文 514
码字总数 330865
作品 0
武汉
架构师
私信 提问
从零开始搭建论坛(二):Web服务器网关接口

在 从零开始搭建论坛(一):Web服务器与Web框架 中我们弄清楚了Web 服务器、Web 应用程序、Web框架的概念。对于 Python 来说,越来越多的 Web 框架面世,在给我们更多选择机会的同时,也限制...

selfboot
2016/08/07
0
0
Python Web 应用:WSGI基础

在Django,Flask,Bottle和其他一切Python web 框架底层的是Web Server Gateway Interface,简称WSGI。WSGI对Python来说就像 Servlets对Java一样——一种用于web服务器并允许不同web服务器和...

局长
2016/09/08
3.9K
12
如何理解 Python Web 开发?

因为 python代码的优雅美观且易于维护这一特点,越来越多的人选择使用Python做Web开发。而Python的Web框架百花齐放,目前比较流行的框架有大包大揽的Django,小巧灵活的Flask、Bottle,还有性...

Python资料
2018/06/04
0
0
centos服务器uWSGI 和 Nginx 部署 Flask 项目

前言 前段时间手贱买了几个月的腾讯云服务器。我一个做移动端的买国内服务器干啥,又不能搭梯子。最后想用python爬写数据写几个接口用app玩玩试试看看。 可惜自己只用过servelet,python的w...

静默加载
2018/08/10
0
0
nginx上用fastcgi配置python环境(一)

费了2天的功夫,翻阅了无数的中文、英文资料,终于搞定。写下此文留待以后翻阅用 本文环境,centOS 5.4 ,Nignx-0.8.49, Python 2.6.5 =====================================================...

不必在乎朕是谁
2013/01/15
164
0

没有更多内容

加载失败,请刷新页面

加载更多

检查字符串是否不为空且不为空

如何检查字符串是否不为null也不为空? public void doStuff(String str){ if (str != null && str != "**here I want to check the 'str' is empty or not**") { /* handl......

javail
2分钟前
7
0
No module named 'apscheduler.schedulers'

关于 ModuleNotFoundError: No module named 'apscheduler.schedulers' 和 ModuleNotFoundError: No module named 'apscheduler' 的问题,网上有不少解决。大多数都是因为,文件起名与模块名......

開援带碼
23分钟前
27
0
如何查看Android的系统版本?

有谁知道我怎么能检查系统版本(例如1.0 , 2.2 ,等)编程? #1楼 我无法对答案发表评论,但是Kaushik的答案存在一个严重错误:SDK_INT与系统版本不同,但实际上是指API级别。 if(Build.VER...

技术盛宴
49分钟前
35
0
引入AI变量,精准农业正在加速豹变?

  不久前,“江苏省脱贫率达 99.99%,尚未脱贫人数仅剩 6 户、17 人”这样一则新闻刷屏。“把这 17 个人迁出,江苏就全省脱贫”、“最后这 6 户人家拖了后腿”,在网民们的调侃和质疑声背后...

水果黄瓜
52分钟前
41
0
Elasticsearch系列---结构化搜索

概要 结构化搜索针对日期、时间、数字等结构化数据的搜索,它们有自己的格式,我们可以对它们进行范围,比较大小等逻辑操作,这些逻辑操作得到的结果非黑即白,要么符合条件在结果集里,要么...

清茶豆奶
今天
69
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部