还能不能愉快地起一个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 ...
随机推荐
- java 自动拆箱
Integer a0 = ; Integer a1 = ; Integer b0 = ; Integer b1 = ; ; System.out.println(a0 == a1); >> ...
- 【转】Windons+jenkins,构建java程序,提示C:\Windows\TEMP\jenkins5037773887088486383.bat Access is denied
坑1: !!!前提:已设置本机电脑的账号密码, 解决方法:搜索程序services.msc-- 找到Jenkins-- 右键“属性”--登录--此账户--输入本机的账号密码--保存-- 停止Jenki ...
- Mysql安装、设置密码、编码
一.MySQL介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是 ...
- 多个for循环嵌套会影响速度
在复现Meta-SR的过程中,发现如果嵌套多个for 循环会使速度过慢.这是下面实验得出的结论: import time t1 = time.time() a = range(3000) b = ra ...
- python -yield理解
参考:https://foofish.net/iterators-vs-generators.html 从网上看到一个面试题,求最后的输出结果: def add(n, i): return n+ide ...
- 【转】git示意图
- 高校表白APP-冲刺第二天
今天进行了第二次会议. 一.任务: 昨日任务完成基本登录注册修改页面布局. 今日任务完成登录界面的基本框架. 明日任务登录修改注册跳转,解决真机运行闪退. 二.遇到的困难: 登录界面按钮布局位置,输入 ...
- IP通信基础学习第八周
安装完华三模拟器,拖多台设备到工作区,全部启动及配置,建立好拓扑图,之后启动命令行终端. 配置登录用户,口令的指令有: <H3C> //用户直行 ...
- Http协议&Servlet
http协议 针对网络上的客户端 与 服务器端在执行http请求的时候,遵守的一种规范. 其实就是规定了客户端在访问服务器端的时候,要带上哪些东西, 服务器端返回数据的时候,也要带上什么东西. 版本 ...
- 支持向量机(Support Vector Machine):对偶
前言 学SVM看到对偶问题的时候很难受,因为看不懂,数学知识真的太重要了.后来在B站看到某up主的精彩推导,故总结如下. SVM基本型 由之前最大化间隔的计算可得SVM的基本型为: $\underse ...