两个Python web框架:Django Tornado比较

就是说它作为 web 框架比 Django 简单,又支援异步 IO,且更不需要前端的 webserver ?
我已经混乱了, Tornado是 Nginx、Django、Node.js 的结合体?又或是 Nginx * 20% + Django * 40% + Node.js * 40% ?


你需要搞清楚几个概念:
1,web server是监听端口,负责HTTP链接管理、数据收发、HTTP协议实现等底层上的处理。
2,Web框架定义的是单个HTTP请求处理的流程。
3,nginx是反向代理服务器,是一个特殊的web server应用,和web server并不是同级的概念。

Tornado既是web server又是web框架,这两者并不矛盾。

举例来说,你写了一个tornado应用之后,直接把tornado端口跑在8000,这个时候,通过localhost:8000/foo就能访问到你的网页。这里分两步,tornado完成了底部IO事件的监听和数据接受等工作,这是tornado完成了其作为web server的使命。然后你通过按照tornado框架定义的流程,在对应的地方写了个get函数,实现了这个页面的具体内容,这是tornado作为web 框架体现了作用。

那么nginx有什么用?

他是个反向代理,反向代理顾名思义,其作用就是将接收到的HTTP请求按照一定的规则转发给后端其他服务器处理。

比如在你的一台机器上跑了三个tornado应用:foo1,foo2,foo3,端口分别为8000,8001,8003,你希望用户可以直接通过80端口来访问这些应用。这个时候你就可以用nginx来达到这个目的了。让nginx跑在80端口,当他接收到请求时,如果是/foo1,就转发给8000端口处理;如果是/foo2,就转发给8001端口处理,foo3类似。


所以,tornado和nginx并没有什么联系。实际上,很多框架都实现了一些简易web server,用于调试。tornado的web server是异步的,以可以处理大量的非活跃长连接著称。所以其web server是他的一个特性feature,在介绍的时候就会提及自己是一个很酷的webserver了。

回到主题,题主你在你机器上装装nginx、用tornado写个hello world就都清楚了。
==============================================================================================

Django

 

Django 应该是最出名的py框架,Google App Engine甚至Erlang都有框架受它影响。

 

Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。

 

Django提供的方便,也意味着Django内置的ORM跟框架内的其他模块耦合程度高。

 

应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利;理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修。

 

Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到一定规模后,都需要对其进行重构,才能满足性能的要求。

 

这方面的经验可以参考:http://www.slideshare.net/zeeg/djangocon-2010-scaling-disqus

 

Ruby的Rails也有类似的问题;以Twitter为例,推特到了今日的规模,不要说Rails,甚至是连Ruby都需要抛弃重来。

 

就我的感觉Django适用的是中小型的网站,或者是作为大型网站快速实现产品雏形的工具。

 

快速推出产品是王道:

 Believe it or not, the bigger problem isn't scaling, it's getting to the point where you have to scale. Without the first problem you won't have the second. - http://gettingreal.37signals.com/ch04_Scale_Later.php

 

===== Django 模板 =====

Django的模板系统设计十分有意思,也应该其框架内影响最大、争议最大的部分。

 

Django模板的设计哲学是彻底的将代码、样式分离;asp.net提倡将代码/模板分离,但技术上还是可以混合;而Django则是从根本上杜绝在模板中进行编码、处理数据的可能。

 

比方说,asp.net模板中可以写:

<%

 int i;

 for(i==0;i<10;i++){

 ....

 }

%>

 

Django是彻底不支持嵌入类似上面的代码,仅能使用其模板内置的函数;这实际上,是为其模板构造了一种“新语言”;由于此“新语言”十分简单,所以也能够将其模板移植到不同平台。

 

大多数情况下,Django的模板功能是足够的,但对于特殊(有时“特殊”也不是十分特殊)的情况,还是需要在模板中嵌入代码,那么就需要根据其模板系统的规则做模板扩展。有时候,模板中直接写一行代码能够解决的问题,用模板扩展实现后,会变成十几行代码。

 

是否容忍在模板中编程,正是Django模板争议最大之处。

 

Tornado

 

Tornado( http://www.tornadoweb.org )是Facebook开源出来的框架,其哲学跟Django近乎两个极端。

 

Tornado走的是少而精的方向,它也有提供模板功能;虽然不鼓励,但作者是可以允许在模板进行少量编码(直接嵌入单行py代码)的。

 

如果跟asp.net相比,Tornado有点类似仅实现了AsyncHttpHandler;除此之外,全部需要自己去实现。

 

好吧,其实它有模板,有国际化支持,甚至还有内置的OAuth/OpenID模块,方便做第三方登录,它其实也直接实现了Http服务器。

 

但它没有ORM(仅有一个mysql的超简单封装),甚至没有Session支持,更不要说Django那样自动化的后台。

 

假设是一个大型网站,在高性能的要求下,框架的各个部分往往都需要定制,可以复用的模块非常少;一个以Django开发的网站,各部分经过不断的定制,Django框架剩下的,很有可能也就是tornado一开始所能提供的这部分。

 

殊途同归。

 

===== HTTP服务器 =====

Tornado为了高效实现Comet/后端异步调用HTTP接口,是直接内嵌了HTTP服务器。

 

前端无需加apache / lighttpd / nginx等也可以供浏览器访问;但它并没有完整实现HTTP 1.1的协议,所以官方文档是推荐用户在生产环境下在前端使用nginx,后端反向代理到多个Tornado实例。

 

Tornado本身是单线程的异步网络程序,它默认启动时,会根据CPU数量运行多个实例;充分利用CPU多核的优势。

 

===== 单线程异步 =====

网站基本都会有数据库操作,而Tornado是单线程的,这意味着如果数据库查询返回过慢,整个服务器响应会被堵塞。

 

数据库查询,实质上也是远程的网络调用;理想情况下,是将这些操作也封装成为异步的;但Tornado对此并**没有**提供任何支持。

 

这是Tornado的**设计**,而不是缺陷。

 

一个系统,要满足高流量;是必须解决数据库查询速度问题的!

 

数据库若存在查询性能问题,整个系统无论如何优化,数据库都会是瓶颈,拖慢整个系统!

 

异步并**不能**从本质上提到系统的性能;它仅仅是避免多余的网络响应等待,以及切换线程的CPU耗费。

 

如果数据库查询响应太慢,需要解决的是数据库的性能问题;而不是调用数据库的前端Web应用。

 

对于实时返回的数据查询,理想情况下需要确保所有数据都在内存中,数据库硬盘IO应该为0;这样的查询才能足够快;而如果数据库查询足够快,那么前端web应用也就无将数据查询封装为异步的必要。

 

就算是使用协程,异步程序对于同步程序始终还是会提高复杂性;需要衡量的是处理这些额外复杂性是否值得。

 

如果后端有查询实在是太慢,无法绕过,Tornaod的建议是将这些查询在后端封装独立封装成为HTTP接口,然后使用Tornado内置的异步HTTP客户端进行调用。

转载于:https://www.cnblogs.com/duanxz/p/5428525.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广义动量定理之速度V的应用分析

广义动量定理之速度V的应用分析 从广义动量定理FαtnmV的角度说&#xff0c;改变速度V&#xff0c;就可以改变成果nmV。速度派以改变速度V作为其主要目的。 速度V应用于兵贵神速 理论简介&#xff1a;三国时期曹操的谋士郭嘉说&#xff1a;“兵贵神速”。 孙子在九地篇中说“兵…

云安全联盟发布更新版安全应用指南

本文讲的是云安全联盟发布更新版安全应用指南【IT168 资讯】云安全联盟(CSA)本周四发布了云计算服务的第二版安全应用指南。这一非营利性质的联盟正式成立于四月份&#xff0c;其目的是推进云计算安全的最佳实践。他们在2009 RSA会议(全球信息安全领域最具权威的年度峰会)上发布…

[BZOJ1026] [SCOI2009] windy数 (数位dp)

Description windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道&#xff0c;在A和B之间&#xff0c;包括A和B&#xff0c;总共有多少个windy数&#xff1f; Input 包含两个整数&#xff0c;A B。 Output 一个整数 Sample Input…

JQuery ajax()实例

前端页面&#xff1a; <!doctype html><html><head><meta charset"utf-8"><title>搜索</title></head> <body><div class"zgz">请输入(A-Z):<input type"text" value"GET"&…

黑马数据库html阶段考试,黑马web阶段web试题学生版.docx

Web 阶段 Web 试题1. 动态网站的开发技术有 (A)JSPHTMLCSSJavaScript 下面哪个请求头信息可以实现防盗链 (C)LocationRefreshRefererIf-Modified-Since在Web应用程序的文件与目录结构中&#xff0c;是放置在(A )WEB-INF 目录conf 目录lib 目录classes 目录下面哪一个指明向客户…

学生信息管理系统中遇到的问题解析

项目概述&#xff1a;做一个简单的学生信息管理系统 要求&#xff1a;学生信息的增删查改&#xff0c;成绩的增删。自动生成的编号。 工具&#xff1a;微软企业库与MiniUI 遇到的问题与解决方法&#xff1a;&#xff08;前面的博文也有类似的问题和解决方法&#xff0c;这里不再…

简单地使用线程之一:使用异步编程模型

.NetFramework的异步编程模型从本质上来说是使用线程池来完成异步的任务&#xff0c;异步委托、HttpWebRequest等都使用了异步模型。 这里我们使用异步委托来说明异步编程模型。 首先&#xff0c;我们来明确一下&#xff0c;对于多线程来说&#xff0c;我们需要关注哪些问题。 …

ShowType=0,交换机命令showinterfacestype0/port_#switchport|trunk用于显 - 信管网

交换机命令show interfaces type0/port_# switchport|trunk用于显示中继连接的配置情况&#xff0c;下面是显示例子&#xff1a;2950#show interface fastEthernet0/1 switchportName: fa0/1Switchport: EnabledAdministrative mode: trunkOperational Mode: trunkAdministrati…

SQL SERVER学习笔记(二)数据库管理

第二部分&#xff1a;数据库管理 单词记忆&#xff1a;transact&#xff1a;处理 create&#xff1a;创建 execute&#xff1a;执行、完成 一、 SQL Server的特性 1、 安装简便&#xff1a;为了便于安装、使用和管理&#xff0c;SQL Server2000提供了一组管理和开发工具。 …

SQL——快速定位相关的外键表

转载于:https://www.cnblogs.com/mingle/p/4506422.html

Linux安装glibc(升级版本)

2019独角兽企业重金招聘Python工程师标准>>> glibc下载地址&#xff1a;http://ftp.gnu.org/gnu/glibc/ 这里下载 glibc-2.15&#xff1a; http://ftp.gnu.org/gnu/glibc/glibc-2.15.tar.gz glibc-ports-2.15&#xff1a; http://ftp.gnu.org/gnu/glibc/glibc-ports…

定义列表的特点html,HTML的列表表格表单知识点

无序列表格式 有序列表格式第一项 …

Javascript 获取url参数,hash值 ,cookie

/*** 获取请求参数* param key* returns {*}*/ function getRequestParameter(key){var params getRequestParameters();return params[key]; }/*** 获取请求参数列表* returns {{}}*/ function getRequestParameters(){var arr (location.search || "").replace(/…

C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码

本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码。网上文章大多只是简单介绍内置参数的设置&#xff0c;根据我的使用目的&#xff0c;增加了自定义目标二维码图片尺寸和白边边框。有需要的朋友们可以试一下&#xff0c;如有bug欢迎指正。 首先&…

html设置百度协议,网站HTML结构SEO要求说明(含移动站)

网页结构一、网页中主体结构标签一一对应。网页头部区域网页底部区域网页边框区域网页导航区域网页章节、页眉、页脚详情页文章区域详情页作者信息详情页中文章的发布日期列表页中文章列表区域二、其他说明1、首页head中标注Meta标签协议&#xff0c;标识对应的网页浏览&#x…

【Fanvas技术解密】HTML5 canvas实现脏区重绘

先说明一下&#xff0c;fanvas是笔者在企鹅公司开发的&#xff0c;即将开源的flash转canvas工具。 脏区重绘(dirty rectangle)并不是一门新鲜的技术了&#xff0c;这在最早2D游戏诞生的时候就已经存在。 复杂的术语或概念就不多说&#xff0c;简单说&#xff0c;脏区重绘就是每…

javascript 学习教程

1&#xff0c;JavaScript 是一种轻量级的编程语言&#xff0c;是可插入 HTML 页面的编程代码。 2,以<script>标签开始&#xff0c;以</script>标签结束。 3,引用放在外部文件的扩展名为.js的脚本文件 <script src"myScript.js"></script> 4&…

我国非按劳分配收入

我国现阶段非按劳分配收入探讨 我国社会主义初级阶段的个人消费品分配&#xff0c;是通过多种分配方式实现的。除了占主体地位的按劳分配方式之外&#xff0c;还存在许多种类的非按劳分配方式。因此&#xff0c;在我国城乡居民个人收入总额中&#xff0c;除了一部分按劳分配收入…

html调用js里面的函数,html如何调用js函数

html调用js函数的方法&#xff1a;1、用控件本身进行调用&#xff1b;2、通过javascript中的时间控件定时执行&#xff1b;3、通过getElementById调用&#xff1b;4、通过document.getElementsByName调用。本文操作环境&#xff1a;Windows7系统、html5&&javascript1.8…

大部分人都会做错的经典JS闭包面试题

2019独角兽企业重金招聘Python工程师标准>>> 由工作中演变而来的面试题 JS中有几种函数 创建函数的几种方式 三个fun函数的关系是什么&#xff1f; 函数作用域链的问题 到底在调用哪个函数&#xff1f; 后话 转载于:https://my.oschina.net/u/3687565/blog/1549046