[譯] 第二十五天: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

相關文章
相關標籤/搜索