还能不能愉快地起一个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 ...
随机推荐
- sql 查询所有表以及表结构
查询数据库中所有的表: as statu from [sysobjects] where [type] = 'u' order by [name] 查询表结构: --查询表结构 ALTER PROCE ...
- 论文速读(Chuhui Xue——【arxiv2019】MSR_Multi-Scale Shape Regression for Scene Text Detection)
Chuhui Xue--[arxiv2019]MSR_Multi-Scale Shape Regression for Scene Text Detection 论文 Chuhui Xue--[arx ...
- centos7安装nginx1.10.1
安装nginx. 1.首先在根目录下创建一个software文件夹用来存储下载的压缩包. 2.然后cd跳转的software文件夹下,进行压缩包的下载 wget -c https://nginx.or ...
- python 常用turtle
python 常用turtle 常用命令1 import turtle turtle.bgcolor("black") 设置背景颜色 turtle.onscreenclick(x, ...
- ansible-2.1.0.0_module
ansible --version ansible 2.1.0.0 config file = /home/onest/luoliyu/ceph-ansible/ansible.cfg configu ...
- centos7安装配置jdk
① java -version 可以查看系统自带的openjdk版本信息 ② rpm -qa | grep java 查看系统自带的Java文件 ③ 卸载文件(noarch文件可以不用删除) -- ...
- 作业(更新ing)
暴政警告 2019.4.19 1.YBT完成 7 道题目(1)广搜 3 道 (2)最短路 4 道 2.写至少 2 篇博客 (据说集中精力,一个上午/下午就能写完) 1. 一个 又一个 球细胞数目 ...
- 软件目录结构规范(以python为例)
为什么要设计好目录结构 "设计项目目录结构",就和"代码编码风格"一样,属于个人风格问题.对于这种风格上的规范,一直都存在两种态度: 一类同学认为,这种个人 ...
- excel VBA动态链接数据库
最近车间制造部有需求,需要通过excel填写的ID获取数据库中的某个取值.研究了一下VBA,简要记录一下代码,仅供参考. Function GETPMAX(SID As String) As Stri ...
- Linux直播推流
Linux系统实现youtube推流直播 系统:centos-7 软件:FFMPEG, youtube-dl 1. 安装FFMPEG 创建并cd到一个目录,下载最新的FFMPEG(下面是64位,32位 ...