设为首页 收藏本站
查看: 1308|回复: 0

[经验分享] [译] 第二十五天:Tornado

[复制链接]

尚未签到

发表于 2015-7-8 10:13:14 | 显示全部楼层 |阅读模式
前言
  今天的30天挑战,我决定先暂停JavaScript,学习一款叫Tornado的web框架。学Tornado是为了能用Python开发web程序,我只会Flask框架,所以学Tornado能好好补充一下我的Python web开发技能。本文我们要开发的程序会用到Tornado作为REST后端,MongoDB数据库,AngularJS为客户端JavaScript MV*框架,OpenShift作为部署平台。
DSC0000.png

什么是Tornado?
  Tornado是一个开源的Python Web框架,也是非阻塞式web服务,最初在FriendFeed开发。FriendFeed被收购后,由Facebook维护和开发。由于它的非阻塞式的网络I/O特色,有高超的可扩展性,能同时检测上千的并发连接。

程序用例
  本文我们开发个网摘程序允许用户发布和分享链接,你可以查看OpenShift在线程序,和第22天的一样,可以参考之前的用例来了解。

Github仓库
  今天的demo放在 github: day25-tornado-demo-app.

前提准备
  在开始用Tornado之前,我们需要安装Python和virtualenv, 本文我用的Python版本是2.7.
  这个程序需要用MongoDB作数据存储,请下载最新MongoDB.

开发Tornado MongoDB程序
  我们用pip安装开始,对于不了解pip的读者,pip是一个Python包管理。我们可以从官网下载pip,在你系统上任意合适路径运行以下命令。


DSC0001.gif DSC0002.gif


$ mkdir getbookmarks
$ cd getbookmarks
$ virtualenv venv --python=python2.7
$ . venv/bin/activate
$ pip install tornado
$ pip install pymongo
View Code   以上代码会在本机创建一个getbookmarks目录,然后用2.7的Python激活virtualenv,再安装tornado包,最后安装pymongo. Pymongo是官方MongoDB Python驱动,用来写Stories到MongoDB.
  在getbookmarks文件夹下新建getbookmarks.py文件。





$ touch getbookmarks.py
View Code   复制以下代码粘贴到getbookmarks.py源文件。





import os
from tornado import ioloop,web
from pymongo import MongoClient
import json
from bson import json_util
from bson.objectid import ObjectId
class IndexHandler(web.RequestHandler):
def get(self):
self.write("Hello World!!")
settings = {
"template_path": os.path.join(os.path.dirname(__file__), "templates"),
"static_path": os.path.join(os.path.dirname(__file__), "static"),
"debug" : True
}
application = web.Application([
(r'/', IndexHandler),
(r'/index', IndexHandler),
],**settings)
if __name__ == "__main__":
application.listen(8888)
ioloop.IOLoop.instance().start()
View Code   以上代码:


  • 从导入必要库开始。
  • 接着,定义了一个叫IndexHandler的类,用于扩展 web.RequestHandler. Tornado web程序映射URLs或者URL模式到 web.RequestHandler的子类。这些类定义get(), post()等方法来处理HTTP GET或者POST请求,当GET请求发出到'/' url,      IndexHanlder就响应"Hello World!".
  • 定义了一些程序设置,template_path是告诉Tornado程序在templates路径找程序模板,static_path通知程序给静态资源如css, images,和javascript文件用静态路径。同时也通过debug:True激活调试模式,调试模式主要好处是能自动加载更新,我们可以让调试在后台运行,程序照常工作,这大大提高了生产环境效率。
  • 然后,创建了Tornado程序实例,传给路由和设置。
  • 最后用python      getbookmarks.py命令启动服务运行程序。
  用以下命令运行程序,查看  http://localhost:8888 和 http://localhost:8888/index, 确保能看到"Hello World!".





$ python getbookmarks.py
View Code
配置MongoDB
  导入库后添加以下几行,我们定义了MongoDB连接url和数据库名字,如果程序是部署到OpenShift, 那OpenShift指定的环境变量会被使用,否则是用本地配置。





MONGODB_DB_URL = os.environ.get('OPENSHIFT_MONGODB_DB_URL') if os.environ.get('OPENSHIFT_MONGODB_DB_URL') else 'mongodb://localhost:27017/'
MONGODB_DB_NAME = os.environ.get('OPENSHIFT_APP_NAME') if os.environ.get('OPENSHIFT_APP_NAME') else 'getbookmarks'
client = MongoClient(MONGODB_DB_URL)
db = client[MONGODB_DB_NAME]
View Code   我们创建了一个MongoClient实例,传给连接url, 这会连接到运行的MongoDB实例,接下来用MongoClient实例获取数据库。

创建和显示所有文章

现在来加新建和显示文章的功能,先加如下路由到程序实例。





application = web.Application([
(r'/', IndexHandler),
(r'/index', IndexHandler),
(r'/api/v1/stories',StoriesHandler),
],**settings)
View Code   然后定义StoriesHandler用于响应保存文章到MongoDB和查找文章。





class StoriesHandler(web.RequestHandler):
def get(self):
stories = db.stories.find()
self.set_header("Content-Type", "application/json")
self.write(json.dumps(list(stories),default=json_util.default))
def post(self):
story_data = json.loads(self.request.body)
story_id = db.stories.insert(story_data)
print('story created with id ' + str(story_id))
self.set_header("Content-Type", "application/json")
self.set_status(201)
View Code   以上代码:


  • 当用户发出GET请求到 '/api/v1/stories', 我们调用find()到MongoDB, 因为我们没有指定查询条件,所以它会获取数据库中所有文章,我们指定内容类型为      "application/json", 就会给出json响应。
  • 当用户发出POST请求到 '/api/v1/stories', 我们先解码json主体到字典,然后写到MongoDB, 设置相应状态为201(已创建)。

查看独立文章

最后一个后台宫呢功能是查看独立文章,先指定路由。





application = web.Application([
(r'/', IndexHandler),
(r'/index', IndexHandler),
(r'/api/v1/stories',StoriesHandler),
(r'/api/v1/stories/(.*)', StoryHandler)
],**settings)
View Code   然后写StoryHandler.





class StoryHandler(web.RequestHandler):
def get(self , story_id):
story = db.stories.find_one({"_id":ObjectId(str(story_id))})
self.set_header("Content-Type", "application/json")
self.write(json.dumps((story),default=json_util.default))
View Code   以上代码通过story_id查找对应文章,然后转换成json响应。

AngularJS前端
  我决定继续用第22天写的AngularJS前端,第22天展示了怎样用AngualrJS和Java Spring框架,用JavaScript MV*框架最好的是如果你继续坚持REST客户端界面需求,那你可以重用前端代码。详情请参考第22天博客。
  你可以从我的github下载AngularJS前端,复制static和templates文件夹到getbookmarks.py后面。

OpenShift上部署程序
  在OpenShift上部署前,先做以下几步:


  • 在OpenShift上注册。OpenShift完全免费,红帽给每个用户免费提供了3个Gears来运行程序。目前,这个资源分配合计有每人1.5GB内存,3GB磁盘空间。
  • 在本机安装rhc 客户端工具,rhc是ruby gem包,所以你需要安装1.8.7或以上版本的ruby。安装rhc,输入 sudo      gem install rhc. 如果已经安装了,确保是最新的,要更新rhc,输入sudo gem update rhc. 想了解rhc command-line 工具,更多帮助参考 https://www.openshift.com/developers/rhc-client-tools-install.
  • 用rhc setup 命令安装OpenShift. 执行命令可以帮你创建空间,上传ssh 密钥到OpenShift服务器。
  安装后,可以运行以下命令创建OpenShift程序。





$ rhc create-app day25demo python-2.7 mongodb-2 --from-code https://github.com/shekhargulati/day25-tornado-demo-app.git
View Code   它会执行所有从创建程序,到设置公共DNS, 到创建git私有仓库,最后用Github仓库的代码发布应用。程序运行在 http://day25demo-shekhargulati.rhcloud.com/#/
这是今天的内容,继续给反馈吧。
原文:https://www.openshift.com/blogs/day-25-tornado-combining-tornado-mongodb-and-angularjs-to-build-an-app

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84406-1-1.html 上篇帖子: mongodb指南(翻译)(十三) 下篇帖子: MongoDB安装与配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表