[译] 第二十五天:Tornado - 结合Tornado, MongoDB和AngularJS开发应用

前言

今天的30天挑战,我决定先暂停JavaScript,学习一款叫Tornado的web框架。学Tornado是为了能用Python开发web程序,我只会Flask框架,因此学Tornado能好好补充一下个人Python web开发技能。本文咱们要开发的程序会用到Tornado做为REST后端,MongoDB数据库,AngularJS为客户端JavaScript MV*框架,OpenShift做为部署平台。javascript

 

什么是Tornado?

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

程序用例

本文咱们开发个网摘程序容许用户发布和分享连接,你能够查看OpenShift在线程序,和第22天的同样,能够参考以前的用例来了解。 html

Github仓库

今天的demo放在 github: day25-tornado-demo-app前端

前提准备

在开始用Tornado以前,咱们须要安装Pythonvirtualenv, 本文我用的Python版本是2.7. java

这个程序须要用MongoDB做数据存储,请下载最新MongoDBpython

开发Tornado MongoDB程序

咱们用pip安装开始,对于不了解pip的读者,pip是一个Python包管理。咱们能够从官网下载pip,在你系统上任意合适路径运行如下命令。git

$ 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.angularjs

在getbookmarks文件夹下新建getbookmarks.py文件。github

$ touch getbookmarks.py
View Code

复制如下代码粘贴到getbookmarks.py源文件。web

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

以上代码:

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

用如下命令运行程序,查看  http://localhost:8888http://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

以上代码:

  1. 当用户发出GET请求到 '/api/v1/stories', 咱们调用find()到MongoDB, 由于咱们没有指定查询条件,因此它会获取数据库中全部文章,咱们指定内容类型为      "application/json", 就会给出json响应。
  2. 当用户发出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上部署前,先作如下几步:

  1. OpenShift上注册。OpenShift彻底免费,红帽给每一个用户免费提供了3个Gears来运行程序。目前,这个资源分配合计有每人1.5GB内存,3GB磁盘空间。
  2. 在本机安装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.
  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
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

相关文章
相关标签/搜索