还能不能愉快地起一个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 ...
随机推荐
- web攻击之xss(一)
1,xss简介 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击 ...
- zipCrack-v1.1 工具介绍
一个暴力破解zip的工具 用python开发 与kali 自带的fcrackzip类似 git地址:https://github.com/mapyJJJ/python3-for-linux-h-.gi ...
- mac & ip
mac 解决本地网络机器的通信 ip 解决不同网络间主机的通信
- 最简单的 react-router4 的安装和使用
React-Router 的安装 npm install react-router React-Router提供了两个组件:Router和Route.下面看最简单的例子: src/Routes.js ...
- Python 官方文档&教程
英文原版(3.6版): https://docs.python.org/3.6/index.html https://docs.python.org/3.6/tutorial/index.html 汉 ...
- Java EE开发技术课程第七周(json)
JSON: https://baike.baidu.com/item/JSON/2462549?fr=aladdin JSON指JavaScript对象表示法(JavaScript Object No ...
- Original Autel MaxiSys Pro MS908P support 2 Year Free Update Online
You can get 2 Year Free Update Online once you place an order on Autel MS908P. Software Version: Eve ...
- office 2016 官方原版 (含Visio Project 等全套 )下载地址 (不含破解,非网盘下载)不用登录
原文地址:https://www.heidoc.net/joomla/technology-science/microsoft/8-office-2016-direct-download-links ...
- Flutter 输入控件TextField设置内容并保持光标(cursor)在末尾
TextField( controller: TextEditingController.fromValue(TextEditingValue( // 设置内容 text: inputText, // ...
- Python并发编程之线程池&进程池
引用 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...