python网页展示框架_Python网页框架:Django和Tornado

原标题:Python网页框架:Django和Tornado

Python部落组织翻译,禁止转载,欢迎转发

软件开发者杂志,CPOL,2013年10月29日

学习Django和Tornado

这篇文章的作者是Michael D'Agosta,也首次被发表在软件开发者杂志的第201308期中。你可以在软件开发者杂志上找到更多文章。

前言

很久之前,随处可见的是把“服务端页面”放到一起,并将它们和一个数据库连接起来,然后你的网站就出来了。而如今的网页是复杂的、动态的,同时也占用很多基础设施以便让一个网站能长久地在因特网上活跃。新云的是没有人再去从头到尾写这些页面了,因为在很多程序语言里已经提供了很多框架让你建立一个网站。

网页框架的目的就是提供普遍的特性,以便它们能被所有应用所使用。模型-视图-控制器(MVC)模式就是这样一个架构标准用以开发网页应用,因此,框架通常提供了某些数据支持(模型部分M)的形式,URL处理(控制器部分C)以及HTML模板(用户视图部分V)。在这篇文章中,我将介绍Python中的两个网页框架,Django和Tornado。虽然这两个框架都提供了MVC结构,但是他们彼此在MVC上是有相对立的特性。

Django的特性

如果你和大部分人或者公司那样,你会想要从你的用户那里收集信息并存储到一个数据库里面。那么这就是Django真正能解决的所在。Django有一个表格生成器,它能让用户按照数据库字段来定义你的表格,然后生成html页面给你,并能验证用户在POST提交时的数据。Django的地道的数据模型读取你的数据库结构,或者也为你创建一个数据库结构,并可以和软件对象那样为你生成代码以便定义你的数据库结构。然后,你可以读取和设定属性,然后基于过滤器来查询,以及按照类的层级结构那样的对象来考虑你的SQL数据。不过,这个系统的弱点是难以样式化,如果你有一些列的图形设计目的。

模板系统提供了MVC的用户视图V部分。你可以给html模板设定一些变量,这些模板是独立于Python代码的,且这些模板的值也会在运行的时候被替代。这在如今是很标准的做法了,而且Django还能做更多。你可以遍历所有课迭代的对象,比如列表和字典,以及调用函数。对于定义标准网页头和网页脚的时候,模板继承也是一个简单但很强大的方法,和其他特性一样,他们在每一个页面都有。模板化不是网页最快的部分,所以你需要计划好额外的处理时间。

由于Django是如此成熟,它还有其他一些特性,比如:用户认证,本地化,uncode处理。这些特性还在继续增加。如果你想要一个能满足你所有可能的需要的框架,同时你还没有时间或者技能去完成那些所需要的,那么Django就是你所需要的了。正如所描述的,Django是给那些有着工作进程期限的完美主义者而使用的网页框架。

Tornado的特性

Tornado可能是最轻而最严格的,全Python框架。它小而快地处理MVC框架的基本操作。越小也就是越简单,因此你很容易扩展这个框架本身,并直接管理你的网站的基本操作,比如HTTP处理,请求参数的处理。它有类似于Django的url路由功能,但是使用了独立的类来接受各个请求。这就有可能为你的请求来创建类结构,因此你可以把一些类的页面都黏在一起成为一个单一的父级“流”。如果对此有更加精细的了解,你可以做得好。

数据库的连接不再是默认的内建的功能了,但是依然可以在一个叫做torndb的包里面找到。有了这个,你可以马上连接你的MySQL并提交你的请求了。没什么别的但就是可以用了。返回的对象就类似一个字典,很多人认为没有更简单的了。你可以创建你自己的系统用来管理连接和尝试测试请求,因此,在Tornado里面,这是第一个你要额外做一些工作的地方,而且他也正如你想要的那样来运作。

Tornado里的模板语法很想Django的语法,也很大程度上是可互换的:有模板继承,变量绑定,循环和本地化支持。但是Tornado需要很少代码就可以运行更快。你可以为了提速而简化模板编译,通过小心地指明那些文件是不一定要包含的。这是Tornado让你有很大便利地接触系统内部,且让它做你想要它做的一个极好的例子。本地化和unicode支持也是很完整的---你可以创建csv那样的键/值对文件,然后根据浏览器语言头来搜索那些值。只要你以一种开放的方式设计了你的系统,那么你可以让你的网站支持多语言和快速运行。

真正的区分度在于Tornado的读写循环(IOLoop),这是一个异步的软件库,它直接整合了内核EPoll,KQueue和类似的设施。大家熟知的事件循环(Event Loop)这样的编程方式允许你的程序可以脱离它的流控制,所以在你等待内核脱离你的事件的时候,系统可以响应其他网页请求。这有些像Twisted Reactor和Node.js,它们都是基于事件循环的而不是为每个请求都分流一个新的进程。当你在做别的操作,比如Oauth、发帖子、创建一个API调用或者处理一个网页的时候,你可以让用户的请求“挂断”。为了说明这个异步特征,Tornado做了一个网页聊天系统,这个系统只运行一个进程而且还是代码样例遵守的基础。

通过写程序来写代码

由于你在审视比较网页框架,我假设你能够安装Python以及工具包,能够编辑源代码并运行它。这么说吧,学习编程的最好的方式是通过练习和一步步按照例子来做。不多说了,让我们开始写点代码吧!我已经把那些说明各系统的特征的某些例子都发到了github上(https://github.com/mdagosta/hello-sdj)了.

Django的例子

Django自带一个很好的教程,它可以帮助你有更多更深的理解Django的特征,你可以在这里https://docs.djangoproject.com/en/dev/intro/tutorial01/找到。这个能让你知道那些东西能让一个最小化可用的服务器运行起来。。。。。。简而言之,我将会复制粘贴那些最小化的功能部分了。我们来创建几个能让用户通过网页来给你发送邮件的网页,并且保存这些邮件信息在数据库中,而你不要像在经营一个网页版的公司那样来费很大力气。

一旦你装好了Django,你可以从一个shell里面运行Django的管理员系统:

%> django-admin.py startproject django_sdj

%> cd django_sdj

%> python manage.py runserver

然后,在浏览器输入http://localhost:8000,你就可以看到一个标准的hello页面。当你看到这个页面,就往下继续吧。

为简单起见,我们使用sqlite数据库,同事让Django为我们作支持。编辑settings.py这个文件,如下所示:

'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.

'NAME': 'django_sdj.sqlite3',

然后回到shell里面,运行django syncdb:

%> python manage.py syncdb

回到浏览器页面http://localhost:8000,检查它是否中断了。

下一步,我们创建一个Django的应用“App”叫做“hello”(这不是Django的那个项目lingo):

%> python manage.py startapp hello

然后编辑settings.py和hello/models.py,开始给你的app增加一点实际的内容。可以在这里https://github.com/mdagosta/hello-sdj/commit/c8970ded6fc015f57278ad128f5b9195eeaa2a4e查看我做的代码的修改。

检查下Django将产生什么:

%> python manage.py sql hello # sample output. if it looks ok...

%> python manage.py syncdb

Django的管理接口实在是方便和值得设定。我将跳过这些细节,但是你可以在这里看到我做的修改:https://github.com/mdagosta/hello-sdj/commit/7e4744e7c92be1e3430a147b4965ae0b7172dd03

继续往下你可以增加一些urls和视图,在这:https://github.com/mdagosta/hello-sdj/commit/a1882138363ff684c11b427a37a067a75166cff1

希望你已经知道编辑那些和知道怎么编辑那些文件了,然后运行你的app并在浏览器里面查看它吧。我已经做了,而且我认为Git Commit也是一个值得着重的地方,这里有3个更改提交,它们构建了网页版的数据邮件系统的所有的特性:

https://github.com/mdagosta/hello-sdj/commit/3e5b0c5a4fb4beb3e2e968ee1a0e9ecb35bc0fc7

https://github.com/mdagosta/hello-sdj/commit/866c88b3d51724f5e1a8177ce56d66565dc3e8bb

https://github.com/mdagosta/hello-sdj/commit/b97230fbc08ea85c8c8730609f32c3befc097314

我希望你已经搞定了,而且你的应用程序也很好地运作了。如果确是这样,你就给我一个邮件吧,我也会回复你说我收到你的邮件了。不要害羞啦:)

Tornado的例子

对于Tornado例子,我将带你安装Tornado,这样你可以获得Tornado内部的一个演示版的网页聊天应用。这些例子足以说明在不需要任何修改的时候的Polling和Websocket的补充。第一个聊天演示需要Google OAuth,因此如果你还不是一个Google用户的话,你将需要注册一个。

开始从github克隆一个tornado:

%> git clone https://github.com/facebook/tornado.git

%> cd tornado

%> sudo python setup.py install

然后复制tornado/demos/chat文件夹下的内容到你的app里面,然后运行它:

%> cp -R tornado/demos/chat .

%> cd chat

%> ./chatdemo.py # Ctrl-C to exit(按Ctrl-C退出)

使用两个单独的浏览器或者配置文件,然后访问这个页面http://localhost:8888,并且用google账号登陆进去。在聊天窗口里面,你应该可以输入信息了,然后这些能够显示在另一个浏览器内。

对于websockets同样操作。回到文件夹并复制tornado/demos/websocket下的文件到你的app里面:

%> cp -R tornado/demos/websocket .

%> cd websocket

%> ./chatdemo.py # Ctrl-C to exit

你可以看到一些不同的东西出现了,就在你运行服务端的控制台里面。但是,你的信息应该出现在两个浏览器内。

这些代码样例都简单且规整。如果你有兴趣,基于轻而严格的精神,我极力希望你读完这些代码。chat/chatdemo.py是160行代码的app,而websocket/chatdemo.py只有106行代码。去读吧,然后学习它们。要特别注意的是,对于@tornado.web.authenticated,@tornado.web.asynchronous,@gen.coroutine来说,RequestHandler类的设定方式是如何的。也要注意的是,在websocket的演示中,ChatSocketHandler是如何将WebSocketHandler作为它的父级类的。如果你很想做一个实时系统,那就试试修改ChatSocketHandler,然后看看你能做到哪一步吧。

如何选择

从Django何Tornado中做选择的话,你应该考虑你是想要创建已给什么类型的网站,你的团队的技术级别和员工彼此的能力近似程度,以及多大程度上你能付出。Django一般来说新手的好的选择,因为对于项目的预算和截止周期,它抽离了很多细节。而Tornado将一般地允许有经验的开发者完整做一个大的项目,尽管这需要很大的努力和付出去构建底层设施。

如果你的团队是分布式的,分散的,那么Django将提供更好的工具来处理schema管理和数据迁移,而这是Tornado不能做的。但是,如果你的团队聚集程度很好,你可以培育一个把小项目做到大的团队文化。

最后,如果你的应用程序需要很多的,诸于轮循(polling)或者网页套接字(web sockets),或者是为了完成用户的网页请求而需要去创建一些网页请求,那么Tornado的读写循环(IOLoop)将给你很大帮助。虽然异步系统会伴有一些风险,比如主线程阻塞,但是当阻塞缓解的时候,异步系统可以带来很大的动态和交互特征,而这些特性是很难通过服务器分流的凡是来做到的。如果你已经有了一个技术能力很强很全的团队,且紧紧地在一起工作,那么你基本确定了是能够使用Tornado做出任何有前景的东西了。

总结

如果你是从头刚开始一个新的项目,我强烈建议你用Python。这是很通用的、很清晰的、速度足够快和特性很多的语言,这样你可以让一个大的团队来创建一个高性能的网站。你将要选择一个适合你的团队和项目的网页框架,在Django和Tornado之间选一个都可以让你完成几乎任何事情。

本文最先发表在软件开发者杂志第201308期上。你可以在软件开发者杂志找到更多文章。同时你可以在此(http://sdjournal.org/3pack-pythons-buy-for-60-dollars/)购买三期软件开发者杂志以及专注于Python编程的Hackin9杂志。在Python StarterKit中,学习如何开始你的最流行的Python语言的旅程。然后Python In a Few Lines of Codes会将你提高到下一个级别。当你做了,试试Offensive Python并成为专家吧。

许可证

这篇文章以及所附带的源代码和文件已被代码项目开放许可证(CPOL)授权。

英文原文:http://www.codeproject.com/Articles/644304/Django-and-Tornado-Python-Web-Frameworks

译者:gvicky返回搜狐,查看更多

责任编辑:

你可能感兴趣的:(python网页展示框架)