还能不能愉快地起一个web服务啦?——1st Step!白话http和代码交互的那点儿事儿~
学写python的时候,我们多多少少都接触到了web程序,然而你有没有想过,当浏览器发送了一个http请求时,等待接收这个请求的后端代码是一种什么样的思想感情?
就像下面这张图里画的一样,后端也许是一段java代码,也许是php代码,当然,如果代码出自我手,最可能的还是一段python代码。这就好比,当你在社交软件上给一个陌生人发了一条消息,对面这个人可能是英国人、印度人也有可能是一只羊或者一只狗。。。那么问题来了,他们怎么知道你在说啥?当然了,在web服务的世界里没有现实中那么复杂,我们不需要考虑后台接收请求的是一只羊。。。接下来我们就来看看,在url和代码之间到底发生了什么见不得人的事儿~
首先,当我们写了一段代码可以被http访问的时候,我们就建立了一个webserver。从下图中我们不难看出,这就是浏览器和web服务器之间的日常工作,对于服务器来说,要做的5件事情中,只有第3件是根据请求的不同在发生变化的:
因此,本着解耦的思想,就有人提出了新的方案,将服务器端反复做的事情独立出来,封装起来,对于程序员来说,我们只需要关注处理请求的部分,有专门的逻辑替我们处理这万年不变的4步,是不是就使得代码简洁了很多?
然而,当我们这么做之后,服务器和app之间就不再是紧密团结在一起的整体,服务器必须知道要讲接收到的请求、参数以什么方式传达到app端,这就是我们在django中可以使用request.method、request.POST.get等方法的原因——约好了呀,说高大上点儿,这种约定就叫做协议!
下图是我们在写django时经常做的事情,左侧是一个http请求,右侧是python代码,我们只需要在代码里写一个函数,url配一配,就可以使用左侧的url请求到后端的代码,为什么如此顺利,是什么让http和python代码之间的代沟消失了?
以Django框架为例,Django在这个过程中做了哪些事儿呢?它就是很贴心的把整个服务器要做的事情以及服务器和app交互的过程给封装起来了呀~~~
这么说起来,Django对我们的代码来说,真是又当爹又当妈的模范家长啊!
当然啦!除了Django之外,python还有很多其他的web框架、模块都做了同样的封装,他们也能对http请求进行分析,并承担起和后台代码交互的重任,然而我们知道人与人之间即便是交流同样的事情也有很多种不同的表达方式,因此,我们说,虽然同样是做http和代码的交互工作,但对协议的定义可能不尽相同。
下面列举一些常见的 Python HTTP 服务器,以及它们目前的大致发展情况,以便用户的对比选择:
Name | Version | http 1.1 | Flavour | Repo. | Community |
---|---|---|---|---|---|
Gunicorn | 0.6.4 | No | processor/thread | GIT | #gunicorn |
uWSGI | Trunk (253) | Yes | processor/thread | repo | Mailing List |
FAPWS3 | 0.3.1 | No | processor/thread | GIT | Google Groups |
Aspen | 0.8 | No | processor/thread | SVN | Google Groups |
Mod_WSGI | 3.1 | Yes | processor/thread | SVN | Google Groups |
wsgiref | Py 2.6.4 | No | processor/thread | SVN | Mailing List |
CherryPy | 3.1.2 | Yes | processor/thread | SVN | Planet, IRC |
Magnum Py | 0.2 | No | processor/thread | SVN | Google Groups |
Twisted | 10.0.0 | Yes | processor/thread | SVN | Community |
Cogen | 0.2.1 | Yes | callback/generator | SVN | Google Groups |
GEvent | 0.12.2 | Yes | lightweight threads | Mercurial | Google Groups |
Tornado | 0.2 | Yes | callback/generator | GIT | Google Groups |
Eventlet | 0.9.6 | Yes | lightweight threads | Mercurial | Mailinglist |
Concurrence | tip | Yes | lightweight threads | GIT | Google Groups |
参考:http://www.nowamagic.net/academy/detail/1330308
还能不能愉快地起一个web服务啦?——1st Step!白话http和代码交互的那点儿事儿~的更多相关文章
- wsgiref手写一个web服务端
''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ...
- 搭建一个web服务下载HDFS的文件
需求描述 为了能方便快速的获取HDFS中的文件,简单的搭建一个web服务提供下载很方便快速,而且在web服务器端不留临时文件,只做stream中转,效率相当高! 使用的框架是SpringMVC+HDF ...
- 【LINUX】——linux如何使用Python创建一个web服务
问:linux如何使用Python创建一个web服务? 答:一句话,Python! 一句代码: /usr/local/bin/python -m SimpleHTTPServer 8686 > ...
- [lucene系列笔记3]用socket把lucene做成一个web服务
上一篇介绍了用lucene建立索引和搜索,但是那些都只是在本机上运行的,如果希望在服务器上做成web服务该怎么办呢? 一个有效的方法就是用socket通信,这样可以实现后端与前端的独立,也就是不管前端 ...
- weblogic的安装和注意的问题以及在idea怎么用weblogic启动一个web服务
第一步下载weblogic: 大家可以通过我的网盘下载weblogic,地址如下 https://pan.baidu.com/s/1NkZ_Gd-xfim5YGcdtjYoUw 第二步安装weblog ...
- Tornado创建一个web服务
import tornado.web import tornado.ioloop import tornado.httpserver import tornado.options import con ...
- Tornado 高并发源码分析之一---启动一个web服务
前言: 启动一个tornado 服务器基本代码 class HomeHandler(tornado.web.RequestHandler): #创建 RequesHandler 对象,处理接收到的 h ...
- 二.spring boot第一个web服务
通过<一.spring boot初始化项目>我们已经会初始化spring boot项目,那本篇文章就说明下初始化项目的具体内容,并编写第一个Hello页面. 项目结构 mvnw.mvnw. ...
- 【lucene系列学习三】用socke把lucene做成一个web服务并实现多线程
首先,参考http://www.cnblogs.com/itlqs/p/6104672.html和http://www.cnblogs.com/itlqs/p/6079301.html 然后,Loca ...
随机推荐
- [PHP] 解决人人商城收银台不能上传图片问题
反正网上一大堆,也不知道哪个版本有修复,反正我的没有修复. 问题报错:ReferenceError: angular is not defined 解决如下: 修改文件:addons/ewei_sho ...
- 【速读】——ResNeXt
Saining——[arXiv2017]Aggregated Residual Transformations for Deep Neural Networks 目录 作者和相关链接 主要思想 Res ...
- 【JavaScript】数组
[声明一个数组]var a=[1,1,1]; [定义数组的长度]var a=new Array(2); [特殊数组]arguments[0][可以不用声明,当数组内没有东西时可以直接通过方法的参数自动 ...
- python format()用法
转自 https://www.cnblogs.com/gide/p/6955895.html python2.6开始,新增了一种格式化字符串的函数str.format(),此函数可以快速处理各种字符串 ...
- 语音活性检测器py-webrtcvad安装使用
谷歌为WebRTC项目开发的VAD是目前最优秀.最先进和免费的产品之一.webrtcvad是WebRTC语音活动检测器(VAD)的python接口.兼容python2和python3.功能是将一段音频 ...
- Spring Boot 指定某个依赖的版本
Spring Boot 是个很好的框架,他为了他的一些功能生效,定义了一些依赖的版本. 比如说:Spring Boot 1.5.x 中elasticSearch是2.4.x的,这个是他本身就定义好的. ...
- Linux开局配置注意事项
1.修改ssh配置文件远程端口号,防止攻击 sed -ri 's/“#Port 22”/“Port 10086”/g‘ /etc/ssh/sshd_config 2.修改ssh配置文件 ...
- java数组集合元素的查找
java数组和集合的元素查找类似,下面以集合为例. 数组集合元素查找分为两类: 基本查找: 二分折半查找: 基本查找: 两种方式都是for循环来判断,一种通过索引值来判断,一种通过数组索引判断. 索引 ...
- 继承 派生 super()经典类 新式类
'''1什么是继承? 继承一种新建类的方式,在python中支持一个儿子继承多个爹 新建的类称为子类的或者派生类 父类有可以称为基类或者超类 子类会‘遗传’父类的属性 2 为什么要用继承 减少代码冗余 ...
- 使用grafana provisioning通过配置方式添加datasource和dashboard
grafana provisioning grafana provisioning (http://docs.grafana.org/administration/provisioning/#prov ...