Day 25: 联合Tornado、MongoDB 和 AngularJS 进行应用开发

编者注:咱们发现了有趣的系列文章《30天学习30种新技术》,正在翻译,一天一篇更新,年终礼包。下面是第23天的内容。javascript


今天的《30天学习30种新技术》,我决定暂时放下 JavaScripts 的内容,而去学习一个叫作 Tornado 的 Web 框架。我决定去学 Tornado 的缘由是我这样就能够用 Python 去写 Web 程序了。我只学过 Flask 框架,因此我以为 Tornado 应该能增长我在 Python Web 开发方面的知识。咱们在这篇博文中描述的应用使用 Tornado 来做 REST 后端,MongoDB 做为数据库,AngularJS 做为客户端那边的 JavaScripts MVC 框架,而后 OpenShift 做为部署的平台。
请输入图片描述css

什么是 Tornado?

Tornado 是一个开源的 Python Web 框架,是一个非阻塞(non blocking)的的 Web 服务器, 最开始是在 FriendFeed开发的。在 FriendFeed 被收购以后,Facebook 维护并继续发展 Tornado。因为它的非阻塞网络输入输出(non-blocking network I/O )特性,它有卓越的可扩展性,能同时支持一千多个链接。前端

应用案例

在这篇博文中,咱们将会开发一个容许用户发布和分享连接的社交化书签应用。你能够在这里看到真实在 OpenShift 上运行着的程序。这是咱们在 Day 22 开发过的应用,因此能够参考那篇博文以便更好地理解这个应用案例。java

GitHub 仓库

今天这个演示应用的代码能够在 GitHub 上获得:day25-tornado-demo-apppython

前期准备

在咱们开始 Tornado 以前,咱们须要在机器上安装 Pythonvirtualenv。在这篇博文中,我使用的 Python 版本是 2.7git

这个应用使用 MongoDB 做为数据存储的软件,因此请下载对应你所用操做系统的最新的 MongoDB 发行版angularjs

开发 Tornado MongoDB 应用

咱们会使用 pip 安装 Tornado。对于那些不熟悉 pip 的开发者,其实 pip 就是一个 Python 的包管理器。咱们能够从官网安装 pip。打开终端,转到任何一个在文件系统上方便的目录,而后运行下面的命令:github

$ mkdir getbookmarks
$ cd getbookmarks
$ virtualenv venv --python=python2.7
$ . venv/bin/activate
$ pip install tornado
$ pip install pymongo

上面的命令会在本机上建立一个 getbookmarks 目录,而后在 Python 2.7 下激活 virtualenv,而后安装 tornado 包,最后安装 pymongo。其中,pymongo 是官方 MongoDB 的 Python 驱动;咱们会使用它往 MongoDB 中写入故事(stories)。web

在 getbookmarks 目录下,建立一个名为 getbookmarks.py 的文件:mongodb

$ touch getbookmarks.py

复制下面的代码,而后粘贴到 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()

上面的代码会执行下面的事情:
1. 咱们从导入须要的库开始;
2. 下一步,咱们定义一个扩展类 web.RequestHandler 的新类:IndexHandler。一个 Tornado web 应用会把 URLs 或者 URL 模式对应到 web.RequestHandler 的子类。这些类定义了 get()post() 等方法去处理访问这个 URL 的 HTTP GET 或者 POST 请求。当在地址 '/' 下收到一个 GET 请求时,IndexHandler 会返回一个 "Hello World!!"
3. 接着咱们定义了一些应用的设置。template_path 设置是告诉 Tornado 应用在 template 目录寻找应用模板。static_path 设置告诉应用使用 static 目录里面的相似 css、图像、javascript 文件等静态文件。经过设置 debugTrue,你对项目作了改变后,会自动重载,不用重启查看效果。咱们会在应用开发过程当中,保持着调试器在后台运行。这能提供高效的开发环境。
4. 接着,咱们建立一个Tornado 应用实例,把路由routes)和 settings 传递进去。
5. 最后,咱们使用 python getbookmarks.py 命令启动服务器去运行这个应用

打开 http://localhost:8888http://localhost:8888/index 看看是否看到 "Hello World!!"

配置 MongoDB

在导入库以后,增长下面的语句:

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]

咱们定义了 MongoDB 链接的路由和数据库的名称。若是应用是部署到 OpenShift 上,那么 OpenShift 特定环境变量会先被使用,若是没有,就会使用本机上的配置。

咱们建立了一个 MongoClient 实例,把链接的路由传递进去。这个链接路由是只想运行着的 mongod 实例。接着咱们使用 MongoClient 实例使用数据库

建立和列出全部的故事(Stories)

如今咱们要添加建立新的故事(stories)和列出全部故事(stories)的功能。咱们首先把路由加到下面的应用实例中:

application = web.Application([
    (r'/', IndexHandler),
    (r'/index', IndexHandler),
    (r'/api/v1/stories',StoriesHandler),
],**settings)

接着,咱们定义一个把故事(stories)保存在 MongoDB 和在里面查找全部故事(stories)的 StoriesHandler:

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)

在上面的代码中:
1. 当一个用户发出一个 GET 请求到 /api/v1/stories 时,咱们会向 MongoDB 中发出一个 Find() 方法请求。因为咱们没有具体声明是任何查询,因此它会从 MongoDB 取出全部的故事。咱们把内容类型(content type)设置为 application/json,而后转出(dump) json 回应。
2. 当用户发出一个 POST 请求到 /api/v1/stories,而后咱们首先解码 json 的内容到一个字典(dictionary),而后把数据写入 MongoDB。咱们会把回应状态(response status)设为 201(已建立)。

查看单独的故事(story)

最后一个后端功能是查看单独的故事,咱们首先指明路由:

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

咱们编写 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))

上面的代码查找对应 story_id 的故事,而后转出 json 回应。

AngualarJS 前端

我决定重用我在 第 22 天 写的前端。第 22 天的内容展现了如何以 Java Spring 框架做为后端去使用 AngularJS。使用 JavaScripts MVC 架构的最好的地方就是你能够重用前端的代码,若是你的应用符合 REST 接口客户端的要求。能够阅读第 22 天的内容了解更多。

你能够在个人 GiHub 仓库下载 AngularJS 前端。复制静态文件和模板文件夹,粘贴到 getbookmarks.py 所在文件夹。

部署应用到 OpenShift

在构建应用以前,咱们须要作些设置:

  1. 注册一个OpenShift帐号。注册是彻底免费的,Red Hat给每一个用户三枚免费的Gear,能够用Gear运行你的应用。在写做此文的时候,每一个用户能无偿使用总共 1.5 GB 内存和 3 GB 硬盘空间。

  2. 安装 rhc客户端工具rhc是ruby gem,所以你的机子上须要装有 ruby 1.8.7以上版本。 只需输入 sudo gem install rhc便可安装 rhc 。若是你已经安装过了,确保是最新版。运行sudo gem update rhc便可升级。关于配置rhc命令行工具的详细信息,请参考: https://openshift.redhat.com/community/developers/rhc-client-tools-install

  3. 使用 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

这个命令将建立应用,设置公开的DNS,建立私有git仓库,最后利用你的Github仓库中的代码来部署应用。应用能够经过 http://day25demo-shekhargulati.rhcloud.com/#/ 访问。

今天就到这里了,欢迎反馈意见。


原文 Day 25: Tornado--Combining Tornado, MongoDB, and AngularJS to Build an App
翻译 SegmentFault

相关文章
相关标签/搜索