国内有哪些使用python的开发框架 Tornado框架开发的网站?

Python与Tornado -- 简明现代魔法                    在windows下如何快速搭建web.py开发框架  用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些重量级的框架之外,有一个轻量级的框架使用起来也是非常方便和顺手,就是web.py。它由一名黑客所创建,但是不幸的是这位创建者于2013年自杀了。据说现在由另外一个人在维护和更新。现在就来了解一下windows下如何搭建web.py开发环境。一.安装web.py  在 /webpy/webpy上下载web.py安装包。注意github对浏览器版本有要求的,比如不支持IE9以下的。    自己根据需要下载相应的版本。  下载下来之后,解压,打开cmd,cd到解压目录下,输入  python setup.py install  安装完成即可。(前提必须要安装python,python3以下版本)二.测试程序。  建立一个hello.py文件import weburls = ('/hello', 'hello',
)class hello(object):
def GET(self):
return 'hello world'if __name__ == "__main__":
app = web.application(urls, globals())
app.run()  urls是url映射规则(类似于servlet中的映射),类hello是链接请求响应。  然后在命令行下运行该文件:  &  如果要停止该程序Ctrl+C就可以退出。默认程序运行在8080端口,然后在浏览器里输入:http://127.0.0.1:8080/hello,就可以看到结果了:  &  程序默认运行在8080端口,而如果8080端口被其他程序占用的话,web.py程序会运行失败,比如会出现sockets.error这种错误,此时需要更改端口:      注意web.py并不具备部署网站的能力,因此对于web.py程序只能在本地访问,如果要进行部署必须要使用apache或者nginx。tornado框架blog模块分析与使用
tornado框架blog模块分析与使用
    复制代码 代码如下:  #!/usr/bin/env python## Copyright 2009 Facebook## Licensed under the Apache License, Version 2.0 (the "License"); you may# not use this file except in compliance with the License. You may obtain# a copy of the License at##&&&& ## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the# License for the specific language governing permissions and limitations# under the License.
  import markdownimport os.pathimport reimport torndbimport tornado.authimport tornado.httpserverimport tornado.ioloopimport tornado.optionsimport tornado.webimport unicodedata
  from tornado.options import define, options#定义一些通用的配置信息,比如数据库的连接信息,端口信息define("port", default=8888, help="run on the given port", type=int)define("mysql_host", default="127.0.0.1:3306", help="blog database host")define("mysql_database", default="blog", help="blog database name")define("mysql_user", default="root", help="blog database user")define("mysql_password", default="sa123", help="blog database password")
  #定义Application信息,它是继承tornado.web.Application 的class Application(tornado.web.Application):   # __init__ 函数自动调用&&& def __init__(self):  &&& #这里就是url对应的控制器,下面分别对应一个类,来处理里面的逻辑&&&&&&& handlers = [&&&&&&&&&&& (r"/", HomeHandler),&&&&&&&&&&& (r"/archive", ArchiveHandler),&&&&&&&&&&& (r"/feed", FeedHandler),&&&&&&&&&&& (r"/entry/([^/]+)", EntryHandler),&&&&&&&&&&& (r"/compose", ComposeHandler),&&&&&&&&&&& (r"/auth/login", AuthLoginHandler),&&&&&&&&&&& (r"/auth/logout", AuthLogoutHandler),&&&&&&& ]  &&& #设置,如博客标题,模板目录,静态文件目录,xsrf,是否调试&&&&&&& settings = dict(&&&&&&&&&&& blog_title=u"Tornado Blog",&&&&&&&&&&& template_path=os.path.join(os.path.dirname(__file__), "templates"),&&&&&&&&&&& static_path=os.path.join(os.path.dirname(__file__), "static"),&&&&&&&&&&& ui_modules={"Entry": EntryModule},&&&&&&&&&&& xsrf_cookies=True,&&&&&&&&&&& cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",&&&&&&&&&&& login_url="/auth/login",&&&&&&&&&&& debug=True,&&&&&&& )  &&&& #然后调用tornado.web.Application类的__init__函数加载进来&&&&&&& tornado.web.Application.__init__(self, handlers, **settings)
  # Have one global connection to the blog DB across all handlers  &&&& #数据库连接信息&&&&&&& self.db = torndb.Connection(&&&&&&&&&&& host=options.mysql_host, database=options.mysql_database,&&&&&&&&&&& user=options.mysql_user, password=options.mysql_password)
  #基类,继承自tornado.web.RequestHandler 的,后面的类都是继承这个类的class BaseHandler(tornado.web.RequestHandler):  #属性装饰器,使db函数变成一个属性,便于后面直接使用&&& @property&&& def db(self):&&&&&&& return self.application.db  #获得当前的用户&&& def get_current_user(self):&&&&&&& user_id = self.get_secure_cookie("blogdemo_user")&&&&&&& if not user_id: return None&&&&&&& return self.db.get("SELECT * FROM authors WHERE id = %s", int(user_id))
  #首页class HomeHandler(BaseHandler):&&& def get(self):     #query 查询很多列&&&&&&& entries = self.db.query("SELECT * FROM entries ORDER BY published "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& "DESC LIMIT 5")&&&&&&& if not entries:    &&&& #redirect 重定向到一个url&&&&&&&&&&& self.redirect("/compose")&&&&&&&&&&& return     #render 渲染一个模板,后面是参数&&&&&&& self.render("l", entries=entries)
  class EntryHandler(BaseHandler):&&& def get(self, slug):    #get 得到一个值&&&&&&& entry = self.db.get("SELECT * FROM entries WHERE slug = %s", slug)    #raise 触发一个错误信息,后面必须接类型&&&&&&& if not entry: raise tornado.web.HTTPError(404)&&&&&&& self.render("l", entry=entry)
  class ArchiveHandler(BaseHandler):&&& def get(self):&&&&&&& entries = self.db.query("SELECT * FROM entries ORDER BY published "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& "DESC")&&&&&&& self.render("l", entries=entries)
  class FeedHandler(BaseHandler):&&& def get(self):&&&&&&& entries = self.db.query("SELECT * FROM entries ORDER BY published "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& "DESC LIMIT 10")&&&&&&& self.set_header("Content-Type", "application/atom+xml")&&&&&&& self.render("feed.xml", entries=entries)
  class ComposeHandler(BaseHandler):&&& #装饰器&&& @tornado.web.authenticated&&& def get(self):&&&&&&& id = self.get_argument("id", None)&&&&&&& entry = None&&&&&&& if id:&&&&&&&&&&& entry = self.db.get("SELECT * FROM entries WHERE id = %s", int(id))&&&&&&& self.render("l", entry=entry)
  @tornado.web.authenticated&&& def post(self):&&&&&&& id = self.get_argument("id", None)&&&&&&& title = self.get_argument("title")&&&&&&& text = self.get_argument("markdown")&&&&&&& html = markdown.markdown(text)&&&&&&& if id:&&&&&&&&&&& entry = self.db.get("SELECT * FROM entries WHERE id = %s", int(id))&&&&&&&&&&& if not entry: raise tornado.web.HTTPError(404)&&&&&&&&&&& slug = entry.slug  &&&&&&& #execute是执行的意思&&&&&&&&&&& self.db.execute(&&&&&&&&&&&&&&& "UPDATE entries SET title = %s, markdown = %s, html = %s "&&&&&&&&&&&&&&& "WHERE id = %s", title, text, html, int(id))&&&&&&& else:&&&&&&&&&&& slug = unicodedata.normalize("NFKD", title).encode(&&&&&&&&&&&&&&& "ascii", "ignore")&&&&&&&&&&& slug = re.sub(r"[^\w]+", " ", slug)&&&&&&&&&&& slug = "-".join(slug.lower().strip().split())&&&&&&&&&&& if not slug: slug = "entry"&&&&&&&&&&& while True:&&&&&&&&&&&&&&& e = self.db.get("SELECT * FROM entries WHERE slug = %s", slug)&&&&&&&&&&&&&&& if not e: break&&&&&&&&&&&&&&& slug += "-2"&&&&&&&&&&& self.db.execute(&&&&&&&&&&&&&&& "INSERT INTO entries (author_id,title,slug,markdown,html,"&&&&&&&&&&&&&&& "published) VALUES (%s,%s,%s,%s,%s,UTC_TIMESTAMP())",&&&&&&&&&&&&&&& self.current_user.id, title, slug, text, html)&&&&&&& self.redirect("/entry/" + slug)
  class AuthLoginHandler(BaseHandler, tornado.auth.GoogleMixin):&&& @tornado.web.asynchronous&&& def get(self):&&&&&&& if self.get_argument("openid.mode", None):&&&&&&&&&&& self.get_authenticated_user(self.async_callback(self._on_auth))&&&&&&&&&&& return&&&&&&& self.authenticate_redirect()  #这里定义一个函数,来供上面调用&&& def _on_auth(self, user):&&&&&&& if not user:&&&&&&&&&&& raise tornado.web.HTTPError(500, "Google auth failed")&&&&&&& author = self.db.get("SELECT * FROM authors WHERE email = %s",&&&&&&&&&&&&&&&&&&&&&&&&&&&& user["email"])&&&&&&& if not author:&&&&&&&&&&& # Auto-create first author&&&&&&&&&&& any_author = self.db.get("SELECT * FROM authors LIMIT 1")&&&&&&&&&&& if not any_author:&&&&&&&&&&&&&&& author_id = self.db.execute(&&&&&&&&&&&&&&&&&&& "INSERT INTO authors (email,name) VALUES (%s,%s)",&&&&&&&&&&&&&&&&&&& user["email"], user["name"])&&&&&&&&&&& else:&&&&&&&&&&&&&&& self.redirect("/")&&&&&&&&&&&&&&& return&&&&&&& else:&&&&&&&&&&& author_id = author["id"]&&&&&&& self.set_secure_cookie("blogdemo_user", str(author_id))&&&&&&& self.redirect(self.get_argument("next", "/"))
  class AuthLogoutHandler(BaseHandler):&&& def get(self):&&&&&&& self.clear_cookie("blogdemo_user")  &&& #get_argument为获得next参数的值,默认为"/"&&&&&&& self.redirect(self.get_argument("next", "/"))
  class EntryModule(tornado.web.UIModule):&&& def render(self, entry):&&&&&&& return self.render_string("modules/l", entry=entry)
  #入口函数def main():&&& tornado.options.parse_command_line() & #创建一个服务器&&& (Application()) & #监听端口&&& (options.port)  #启动服务&&& tornado.ioloop.IOLoop.instance().start()
  #调用的入口if __name__ == "__main__":&&& main()
  最后总结一下:
  1)tornado框架中提供的几个demo,都是以这种形式来创建一个应用的2)对每一个控制器函数,要么是,只可能有2个对外的函数,一个是get,一个是post3)数据库有3中调用方式,query,get,exec4)获取参数的值使用 get_argument 函数5)重定向用redirect 函数6)所有的函数都是属性这个类的,所有都用self调用7)渲染模板用render函数
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
港口与航道工程建设工程法规及相关知识建设工程经济考试大纲矿业工程市政公用工程通信与广电工程
操作系统汇编语言计算机系统结构人工智能数据库系统微机与接口
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
Powerpoint教程WPS教程
电子政务客户关系管理首席信息官办公自动化大数据
职称考试题目
就业指导签约违约职业测评
招生信息考研政治
网络安全安全设置工具使用手机安全
3DMax教程Flash教程CorelDraw教程Director教程
Dreamwaver教程HTML教程网站策划网站运营Frontpage教程
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
互联网电信IT业界IT生活
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
组织运营财务资本
视频播放文件压缩杀毒软件输入法微博
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&14个轻量级Python Web框架 - Python - 伯乐在线
& 14个轻量级Python Web框架
我最近发表了一篇名为
的博文——目前它是我博客访问量最高的文章:超过10000人浏览,分享和评论了这些我总结到一起的web框架。
这教会了我一些事,这类文章是有需求的——因为它提供了触手可及的备查和/或探索了做事情的新方式。我发现很多“周刊”在他们的新闻或是博客上刊登了我的文章,对此我感到很高兴。这促使我尝试把更多其他语言中的此类内容总结到一起,比如Python、Ruby、PHP和JavaScript。
众口难调,我尽量把我搜索的时候出现在靠前位置的那些框架都囊括进来了, 我试着以社区规模大小以及它们在GitHub上的活跃度来为它们排名。我建议您在留言中列出您个人最喜爱的框架(或是您正在使用的框架)的链接,我会尽快把它加入到列表中。
是一个可以让你更快地完成工作,更高效地整合系统的语言。你可以学习使用Python并且马上获得生产力的提升,降低维护成本。
Python版的Hello World程序
你可能忘记该怎么做了,下面是一个提示。
print "Hello World!";
print "Hello World!";
我还特别喜欢这一段代码,
while True:
for i in ["/","*","|","\\","|"]:
print "%s\r" % i,
while True:&&&&for i in ["/","*","|","\\","|"]:&&&&&&&&print "%s\r" % i,
Python的Web框架
当一些基础工作不需要你操心的时候,工作起来会比较容易,这也是为什么框架在各个语言的开发者社区中变得如此流行的原因,你无法否认的是,拼装一个网页或是一个项目,比起不得不创建你自己的类或方法要容易的多。
我秉承自己的承诺,在本文或是将来任何的榜单中,不偏向任何一个框架,所有的选择都基于我个人意见和喜好。如果你可以和朋友们分享本文,在你自己的博客上面宣传一下我会很感激你的。同时我也很感激那些让这些Python web框架成为可能所付出的辛勤劳动。
Bobo是一个轻量级的框架,用来创建WSGI web应用。它的目标是简单易用,容易记忆。
它强调两个方面的内容:
1)把URL映射到对象; 2)调用对象来生成HTTP响应。
Bobo 并不具备模板语言,数据库集成层或是其他一些WSGI中间件或特定应用程序库所提供的功能。Bobo建立在其他框架之上,尤其是WSGI和WebOb。
Bottle是一个快速、简单、轻量级的WSGI微型Python web框架。它仅包含单一文件模块,并且不依赖除了Python标准库以外的其他库。
它支持类似Google App Engine、Python Paste这样的应用,还包含了对一些模板的支持,比如Cheetah和Mako。
CherryPy 允许开发者以他们构建其他面向对象Python程序近乎同样的方式来开发web应用。这使得可以在更短的时间内开发出更精简的源代码。CherryPy允许你进行很多常规的Python编程,但是它并没有整合一个模板系统,你需要自己去找一个。(它支持大多数的模板)
CherrPy 能够很好适应默认的Python功能和结构,它在使用更少的代码创建web应用
Cyclone 是一个Python的web服务框架,它基于Twisted protocol实现了Tornado API 。我将把对这个框架的介绍,交给7co.的Gleicon,。
是一个基于Werkzeug 和 Jinja2的微型Python框架。它的目的是更快地上手,基于很多很好的想法开发出来的。你可以在 上了解更多内容。
itty.py是一个小实验,是受的影响而尝试实现的一个微型框架,它刚好够用,没有额外的东西了。
当前支持:
HTTP状态码
支持基本的GET/POST/PUT/DELETE
用户可定义的错误处理器
静态媒体储存
当心!如果你是要找一个久经考验的,企业级框架,你就来错地方了。但是它确实很有趣。
Klein是一个使用Python来开发可用于生产环境web服务的微型框架。它基于使用非常广泛且经过良好测试的组件,比如Werkzeug和Twisted,以及近乎完全的测试覆盖率。你可以阅读来查看介绍。(也许有点过时了)
Morepath是具有强大的能力的Python 微型web框架。Morepath是一个Python WSGI微型框架。他使用路由,但是是针对模型的路由。Morepath是一个模型驱动,灵活的框架,这使得它富有表达力。这里有篇,关于Morepath的一些细节和建议。
ObjectWeb 是一个快速,极简的纯Python web框架,不依赖任何的第三方库。它围绕Python进行设计,因为起初想要把它当做面向对象的编程语言来使用。ObjectWeb支持CGI和WSGI标准,而且有一个内建的开发服务器。我觉得它是由这个设计的
创造Pecan是为了填补Python web框架世界的一个空缺——一个提供object-dispatch方式路由的超轻量级的框架。Pecan的目标并不是要成为一个“全栈”框架,因此没有支持一些额外的功能,比如session或是数据库 。相反,Pecan专注于HTTP本身。
Pyramid是一款非常通用的开源web框架。作为一个框架,它的首要任务是让开发者创建web应用变得简单。web应用的类型并不重要,可以是一个电子表单、一个企业内部网或者是一个社交平台。Pyramid非常通用,可以在各种各样的情况下使用它。
通过阅读/观看SixFeetUp上Caliy的这个.,你可以学到更多关于Pyramid的东西。
Tornado是一个Python web框架,而且是一个异步网络库,最初是为 FriendFeed开发的。通过使用非阻塞I/O,Tornado可以处理数以万计打开的链接,这使它成为长轮询、WebSocket和其他需要为用户提供长连接的应用的理想选择。
Thomas Allen写了一个简单的,关于Tornado是如何工作的以及如何创建一个简单的静态页面。
web.py是一个Python 的web框架,既简单,有强大。web.py处于公有域内,你可以处于任何目的去使用它,没有限制。你可以看上的指导文章以及关于它和Django的比较(好吧,我认为我们不能管这叫做比较)。
一个轻量级、高性能、高并发的WSGI web框架,具备创建现代,高效网络应用的关键功能。这里有一篇来自Andriy Kornatskyy,关于Wheezy的
Python的最小Web框架
我想,有件事还是值得一提,这些框架实际上都是极小的。因此,像web2py和Django这些框架都不会出现在这个列表中。我欢迎大家反馈,审查各个框架,我同时想知道大家对一份全尺寸web框架的列表是否有兴趣?(这将会包括Django)
我把这些框架放在一起,而且我无意间发现了一些很好的文章——其中一个是一些Python web框架的基准测试,这些框架大多数都在本文中列出了。这个基准测试是由Faruk Akgul所完成的,可以点击这个查看
Python的官方页面同样也有专门关于web框架的章节,也许你也想
下一个是什么?Ruby或者PHP?
打赏支持我翻译更多好文章,谢谢!
打赏支持我翻译更多好文章,谢谢!
任选一种支付方式
关于作者:
可能感兴趣的话题
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线据悉,该女子身体携带艾滋病毒及梅毒等传染性疾病。
当地3200人不分国籍,全数裸体并将涂成不同色调的蓝。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  Python部落组织翻译,禁止转载,欢迎转发
  软件开发者杂志,CPOL,日
  学习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上(/mdagosta/hello-sdj)了.
  Django的例子
  Django自带一个很好的教程,它可以帮助你有更多更深的理解Django的特征,你可以在这里/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增加一点实际的内容。可以在这里/mdagosta/hello-sdj/commit/c8970ded6fc015f5b9195eeaa2a4e查看我做的代码的修改。
  检查下Django将产生什么:
  %& python manage.py sql hello # sample output. if it looks ok...
  %& python manage.py syncdb
  Django的管理接口实在是方便和值得设定。我将跳过这些细节,但是你可以在这里看到我做的修改:/mdagosta/hello-sdj/commit/7ebe1e5ae0b7172dd03
  继续往下你可以增加一些urls和视图,在这:/mdagosta/hello-sdj/commit/aff684c11b427a37a067a75166cff1
  希望你已经知道编辑那些和知道怎么编辑那些文件了,然后运行你的app并在浏览器里面查看它吧。我已经做了,而且我认为Git Commit也是一个值得着重的地方,这里有3个更改提交,它们构建了网页版的数据邮件系统的所有的特性:
  /mdagosta/hello-sdj/commit/3e5b0c5a4fb4beb3e2e968ee1a0e9ecb35bc0fc7
  /mdagosta/hello-sdj/commit/866c88b3da65dc3e8bb
  /mdagosta/hello-sdj/commit/b97230fbc08ea85c8cc3befc097314
  我希望你已经搞定了,而且你的应用程序也很好地运作了。如果确是这样,你就给我一个邮件吧,我也会回复你说我收到你的邮件了。不要害羞啦:)
  Tornado的例子
  对于Tornado例子,我将带你安装Tornado,这样你可以获得Tornado内部的一个演示版的网页聊天应用。这些例子足以说明在不需要任何修改的时候的Polling和Websocket的补充。第一个聊天演示需要Google OAuth,因此如果你还不是一个Google用户的话,你将需要注册一个。
  开始从github克隆一个tornado:
  %& git clone /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)授权。
  英文原文:/Articles/644304/Django-and-Tornado-Python-Web-Frameworks
  译者:gvicky
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
聚集优质的Python内容, 提供专业的学习意见, 辅以有...
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:}

我要回帖

更多关于 python开发框架 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信