摘要:在被收購(gòu)之后,維護(hù)并繼續(xù)發(fā)展。設(shè)置是告訴應(yīng)用在目錄尋找應(yīng)用模板。設(shè)置告訴應(yīng)用使用目錄里面的類似圖像文件等靜態(tài)文件。我們會(huì)在應(yīng)用開(kāi)發(fā)過(guò)程中,保持著調(diào)試器在后臺(tái)運(yùn)行。這能提供高效的開(kāi)發(fā)環(huán)境。我們會(huì)把回應(yīng)狀態(tài)設(shè)為已創(chuàng)建。
編者注:我們發(fā)現(xiàn)了有趣的系列文章《30天學(xué)習(xí)30種新技術(shù)》,正在翻譯,一天一篇更新,年終禮包。下面是第23天的內(nèi)容。
今天的《30天學(xué)習(xí)30種新技術(shù)》,我決定暫時(shí)放下 JavaScripts 的內(nèi)容,而去學(xué)習(xí)一個(gè)叫做 Tornado 的 Web 框架。我決定去學(xué) Tornado 的原因是我這樣就可以用 Python 去寫(xiě) Web 程序了。我只學(xué)過(guò) Flask 框架,所以我覺(jué)得 Tornado 應(yīng)該能增加我在 Python Web 開(kāi)發(fā)方面的知識(shí)。我們?cè)谶@篇博文中描述的應(yīng)用使用 Tornado 來(lái)作 REST 后端,MongoDB 作為數(shù)據(jù)庫(kù),AngularJS 作為客戶端那邊的 JavaScripts MVC 框架,然后 OpenShift 作為部署的平臺(tái)。
Tornado 是一個(gè)開(kāi)源的 Python Web 框架,是一個(gè)非阻塞(non blocking)的的 Web 服務(wù)器, 最開(kāi)始是在 FriendFeed開(kāi)發(fā)的。在 FriendFeed 被收購(gòu)之后,F(xiàn)acebook 維護(hù)并繼續(xù)發(fā)展 Tornado。由于它的非阻塞網(wǎng)絡(luò)輸入輸出(non-blocking network I/O )特性,它有卓越的可擴(kuò)展性,能同時(shí)支持一千多個(gè)連接。
應(yīng)用案例在這篇博文中,我們將會(huì)開(kāi)發(fā)一個(gè)允許用戶發(fā)布和分享鏈接的社交化書(shū)簽應(yīng)用。你可以在這里看到真實(shí)在 OpenShift 上運(yùn)行著的程序。這是我們?cè)?Day 22 開(kāi)發(fā)過(guò)的應(yīng)用,所以可以參考那篇博文以便更好地理解這個(gè)應(yīng)用案例。
GitHub 倉(cāng)庫(kù)今天這個(gè)演示應(yīng)用的代碼可以在 GitHub 上得到:day25-tornado-demo-app。
前期準(zhǔn)備在我們開(kāi)始 Tornado 之前,我們需要在機(jī)器上安裝 Python 和 virtualenv。在這篇博文中,我使用的 Python 版本是 2.7
這個(gè)應(yīng)用使用 MongoDB 作為數(shù)據(jù)存儲(chǔ)的軟件,所以請(qǐng)下載對(duì)應(yīng)你所用操作系統(tǒng)的最新的 MongoDB 發(fā)行版。
開(kāi)發(fā) Tornado MongoDB 應(yīng)用我們會(huì)使用 pip 安裝 Tornado。對(duì)于那些不熟悉 pip 的開(kāi)發(fā)者,其實(shí) pip 就是一個(gè) Python 的包管理器。我們可以從官網(wǎng)安裝 pip。打開(kāi)終端,轉(zhuǎn)到任何一個(gè)在文件系統(tǒng)上方便的目錄,然后運(yùn)行下面的命令:
$ mkdir getbookmarks $ cd getbookmarks $ virtualenv venv --python=python2.7 $ . venv/bin/activate $ pip install tornado $ pip install pymongo
上面的命令會(huì)在本機(jī)上創(chuàng)建一個(gè) getbookmarks 目錄,然后在 Python 2.7 下激活 virtualenv,然后安裝 tornado 包,最后安裝 pymongo。其中,pymongo 是官方 MongoDB 的 Python 驅(qū)動(dòng);我們會(huì)使用它往 MongoDB 中寫(xiě)入故事(stories)。
在 getbookmarks 目錄下,創(chuàng)建一個(gè)名為 getbookmarks.py 的文件:
$ touch getbookmarks.py
復(fù)制下面的代碼,然后粘貼到 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()
上面的代碼會(huì)執(zhí)行下面的事情:
1. 我們從導(dǎo)入需要的庫(kù)開(kāi)始;
2. 下一步,我們定義一個(gè)擴(kuò)展類 web.RequestHandler 的新類:IndexHandler。一個(gè) Tornado web 應(yīng)用會(huì)把 URLs 或者 URL 模式對(duì)應(yīng)到 web.RequestHandler 的子類。這些類定義了 get()、post() 等方法去處理訪問(wèn)這個(gè) URL 的 HTTP GET 或者 POST 請(qǐng)求。當(dāng)在地址 "/" 下收到一個(gè) GET 請(qǐng)求時(shí),IndexHandler 會(huì)返回一個(gè) "Hello World!!"
3. 接著我們定義了一些應(yīng)用的設(shè)置。template_path 設(shè)置是告訴 Tornado 應(yīng)用在 template 目錄尋找應(yīng)用模板。static_path 設(shè)置告訴應(yīng)用使用 static 目錄里面的類似 css、圖像、javascript 文件等靜態(tài)文件。通過(guò)設(shè)置 debug 為 True,你對(duì)項(xiàng)目做了改變后,會(huì)自動(dòng)重載,不用重啟查看效果。我們會(huì)在應(yīng)用開(kāi)發(fā)過(guò)程中,保持著調(diào)試器在后臺(tái)運(yùn)行。這能提供高效的開(kāi)發(fā)環(huán)境。
4. 接著,我們創(chuàng)建一個(gè)Tornado 應(yīng)用實(shí)例,把路由routes)和 settings 傳遞進(jìn)去。
5. 最后,我們使用 python getbookmarks.py 命令啟動(dòng)服務(wù)器去運(yùn)行這個(gè)應(yīng)用
打開(kāi) http://localhost:8888 和 http://localhost:8888/index 看看是否看到 "Hello World!!"
配置 MongoDB在導(dǎo)入庫(kù)之后,增加下面的語(yǔ)句:
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 連接的路由和數(shù)據(jù)庫(kù)的名稱。如果應(yīng)用是部署到 OpenShift 上,那么 OpenShift 特定環(huán)境變量會(huì)先被使用,如果沒(méi)有,就會(huì)使用本機(jī)上的配置。
我們創(chuàng)建了一個(gè) MongoClient 實(shí)例,把連接的路由傳遞進(jìn)去。這個(gè)連接路由是只想運(yùn)行著的 mongod 實(shí)例。接著我們使用 MongoClient 實(shí)例使用數(shù)據(jù)庫(kù)
創(chuàng)建和列出所有的故事(Stories)現(xiàn)在我們要添加創(chuàng)建新的故事(stories)和列出所有故事(stories)的功能。我們首先把路由加到下面的應(yīng)用實(shí)例中:
application = web.Application([ (r"/", IndexHandler), (r"/index", IndexHandler), (r"/api/v1/stories",StoriesHandler), ],**settings)
接著,我們定義一個(gè)把故事(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. 當(dāng)一個(gè)用戶發(fā)出一個(gè) GET 請(qǐng)求到 /api/v1/stories 時(shí),我們會(huì)向 MongoDB 中發(fā)出一個(gè) Find() 方法請(qǐng)求。由于我們沒(méi)有具體聲明是任何查詢,所以它會(huì)從 MongoDB 取出所有的故事。我們把內(nèi)容類型(content type)設(shè)置為 application/json,然后轉(zhuǎn)出(dump) json 回應(yīng)。
2. 當(dāng)用戶發(fā)出一個(gè) POST 請(qǐng)求到 /api/v1/stories,然后我們首先解碼 json 的內(nèi)容到一個(gè)字典(dictionary),然后把數(shù)據(jù)寫(xiě)入 MongoDB。我們會(huì)把回應(yīng)狀態(tài)(response status)設(shè)為 201(已創(chuàng)建)。
最后一個(gè)后端功能是查看多帶帶的故事,我們首先指明路由:
application = web.Application([ (r"/", IndexHandler), (r"/index", IndexHandler), (r"/api/v1/stories",StoriesHandler), (r"/api/v1/stories/(.*)", StoryHandler) ],**settings)
我們編寫(xiě) 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))
上面的代碼查找對(duì)應(yīng) story_id 的故事,然后轉(zhuǎn)出 json 回應(yīng)。
AngualarJS 前端我決定重用我在 第 22 天 寫(xiě)的前端。第 22 天的內(nèi)容展示了如何以 Java Spring 框架作為后端去使用 AngularJS。使用 JavaScripts MVC 架構(gòu)的最好的地方就是你可以重用前端的代碼,如果你的應(yīng)用符合 REST 接口客戶端的要求??梢蚤喿x第 22 天的內(nèi)容了解更多。
你可以在我的 GiHub 倉(cāng)庫(kù)下載 AngularJS 前端。復(fù)制靜態(tài)文件和模板文件夾,粘貼到 getbookmarks.py 所在文件夾。
部署應(yīng)用到 OpenShift在構(gòu)建應(yīng)用之前,我們需要做些設(shè)置:
注冊(cè)一個(gè)OpenShift賬號(hào)。注冊(cè)是完全免費(fèi)的,Red Hat給每個(gè)用戶三枚免費(fèi)的Gear,可以用Gear運(yùn)行你的應(yīng)用。在寫(xiě)作此文的時(shí)候,每個(gè)用戶能免費(fèi)使用總共 1.5 GB 內(nèi)存和 3 GB 硬盤空間。
安裝 rhc客戶端工具。rhc是ruby gem,因此你的機(jī)子上需要裝有 ruby 1.8.7以上版本。 只需輸入 sudo gem install rhc即可安裝 rhc 。如果你已經(jīng)安裝過(guò)了,確保是最新版。運(yùn)行sudo gem update rhc即可升級(jí)。關(guān)于配置rhc命令行工具的詳細(xì)信息,請(qǐng)參考: https://openshift.redhat.com/community/developers/rhc-client-tools-install
使用 rhc 的 setup 命令配置你的 OpenShift 賬號(hào)。這個(gè)命令會(huì)幫助你創(chuàng)建一個(gè)命名空間,同時(shí)將你的ssh公鑰上傳至 OpenShift 服務(wù)器。
部署應(yīng)用輸入如下命令即可將應(yīng)用部署到 OpenShift:
$ rhc create-app day25demo python-2.7 mongodb-2 --from-code https://github.com/shekhargulati/day25-tornado-demo-app.git
這個(gè)命令將創(chuàng)建應(yīng)用,設(shè)置公開(kāi)的DNS,創(chuàng)建私有g(shù)it倉(cāng)庫(kù),最后利用你的Github倉(cāng)庫(kù)中的代碼來(lái)部署應(yīng)用。應(yīng)用可以通過(guò) http://day25demo-shekhargulati.rhcloud.com/#/ 訪問(wèn)。
今天就到這里了,歡迎反饋意見(jiàn)。
原文 Day 25: Tornado--Combining Tornado, MongoDB, and AngularJS to Build an App
翻譯 SegmentFault
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/18695.html
摘要:今天的天學(xué)習(xí)種新技術(shù)挑戰(zhàn),我決定使用框架和開(kāi)發(fā)一個(gè)單頁(yè)面應(yīng)用。應(yīng)用我們將開(kāi)發(fā)一個(gè)社交化書(shū)簽應(yīng)用,允許用戶提交和分享鏈接。在元素中使用指令,意味著在整個(gè)中可用。我使用作為該應(yīng)用的模塊名。 編者注:我們發(fā)現(xiàn)了有趣的系列文章《30天學(xué)習(xí)30種新技術(shù)》,正在翻譯,一天一篇更新,年終禮包。下面是第22天的內(nèi)容。 今天的《30天學(xué)習(xí)30種新技術(shù)》挑戰(zhàn),我決定使用Spring框架、MongoD...
介紹 官網(wǎng)文檔:http://apscheduler.readthedoc...API:http://apscheduler.readthedoc... APScheduler是一個(gè)python的第三方庫(kù),用來(lái)提供python的后臺(tái)程序。包含四個(gè)組件,分別是: triggers: 任務(wù)觸發(fā)器組件,提供任務(wù)觸發(fā)方式 job stores: 任務(wù)商店組件,提供任務(wù)保存方式 executors: 任務(wù)...
摘要:在我的機(jī)子上,運(yùn)行于端口,以避免和其他默認(rèn)運(yùn)行于端口的沖突。我們可以使用命令連接數(shù)據(jù)庫(kù)查看定義應(yīng)用層次創(chuàng)建的模板應(yīng)用有一個(gè)問(wèn)題,客戶端和服務(wù)器段的代碼是一樣的。在中加入然后添加問(wèn)題模板注意我們使用了來(lái)確保用戶未登錄的情況下應(yīng)用。 編者注:我們發(fā)現(xiàn)了有趣的一系列文章《30天學(xué)習(xí)30種新技術(shù)》,正在翻譯中,一天一篇更新,年終禮包。下面是第15天的內(nèi)容。 到目前為止我們討論了Bower...
摘要:在我的機(jī)子上,運(yùn)行于端口,以避免和其他默認(rèn)運(yùn)行于端口的沖突。我們可以使用命令連接數(shù)據(jù)庫(kù)查看定義應(yīng)用層次創(chuàng)建的模板應(yīng)用有一個(gè)問(wèn)題,客戶端和服務(wù)器段的代碼是一樣的。在中加入然后添加問(wèn)題模板注意我們使用了來(lái)確保用戶未登錄的情況下應(yīng)用。 編者注:我們發(fā)現(xiàn)了有趣的一系列文章《30天學(xué)習(xí)30種新技術(shù)》,正在翻譯中,一天一篇更新,年終禮包。下面是第15天的內(nèi)容。 到目前為止我們討論了Bower...
摘要:推薦閱讀資源庫(kù)工具應(yīng)用程序精選列表中文版有哪些鮮為人知,但是很有意思的網(wǎng)站一份攻城獅筆記每天搜集上優(yōu)秀的項(xiàng)目一些有趣的民間故事超好用的谷歌瀏覽器油猴插件合集目錄資源文檔文章圖書(shū)會(huì)談教程更多庫(kù)工具管理數(shù)據(jù)部署桌面發(fā)展監(jiān)控應(yīng)用資源文檔介紹文檔教 推薦閱讀 MongoDB 資源、庫(kù)、工具、應(yīng)用程序精選列表中文版 有哪些鮮為人知,但是很有意思的網(wǎng)站? 一份攻城獅筆記 每天搜集 Github ...
閱讀 3950·2021-07-28 18:10
閱讀 2641·2019-08-30 15:44
閱讀 1159·2019-08-30 14:07
閱讀 3514·2019-08-29 17:20
閱讀 1641·2019-08-26 18:35
閱讀 3595·2019-08-26 13:42
閱讀 1869·2019-08-26 11:58
閱讀 1663·2019-08-23 18:33