摘要:在被收購之后,維護并繼續發展。設置是告訴應用在目錄尋找應用模板。設置告訴應用使用目錄里面的類似圖像文件等靜態文件。我們會在應用開發過程中,保持著調試器在后臺運行。這能提供高效的開發環境。我們會把回應狀態設為已創建。
編者注:我們發現了有趣的系列文章《30天學習30種新技術》,正在翻譯,一天一篇更新,年終禮包。下面是第23天的內容。
今天的《30天學習30種新技術》,我決定暫時放下 JavaScripts 的內容,而去學習一個叫做 Tornado 的 Web 框架。我決定去學 Tornado 的原因是我這樣就可以用 Python 去寫 Web 程序了。我只學過 Flask 框架,所以我覺得 Tornado 應該能增加我在 Python Web 開發方面的知識。我們在這篇博文中描述的應用使用 Tornado 來作 REST 后端,MongoDB 作為數據庫,AngularJS 作為客戶端那邊的 JavaScripts MVC 框架,然后 OpenShift 作為部署的平臺。
Tornado 是一個開源的 Python Web 框架,是一個非阻塞(non blocking)的的 Web 服務器, 最開始是在 FriendFeed開發的。在 FriendFeed 被收購之后,Facebook 維護并繼續發展 Tornado。由于它的非阻塞網絡輸入輸出(non-blocking network I/O )特性,它有卓越的可擴展性,能同時支持一千多個連接。
應用案例在這篇博文中,我們將會開發一個允許用戶發布和分享鏈接的社交化書簽應用。你可以在這里看到真實在 OpenShift 上運行著的程序。這是我們在 Day 22 開發過的應用,所以可以參考那篇博文以便更好地理解這個應用案例。
GitHub 倉庫今天這個演示應用的代碼可以在 GitHub 上得到:day25-tornado-demo-app。
前期準備在我們開始 Tornado 之前,我們需要在機器上安裝 Python 和 virtualenv。在這篇博文中,我使用的 Python 版本是 2.7
這個應用使用 MongoDB 作為數據存儲的軟件,所以請下載對應你所用操作系統的最新的 MongoDB 發行版。
開發 Tornado MongoDB 應用我們會使用 pip 安裝 Tornado。對于那些不熟悉 pip 的開發者,其實 pip 就是一個 Python 的包管理器。我們可以從官網安裝 pip。打開終端,轉到任何一個在文件系統上方便的目錄,然后運行下面的命令:
$ 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)。
在 getbookmarks 目錄下,創建一個名為 getbookmarks.py 的文件:
$ 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 文件等靜態文件。通過設置 debug 為 True,你對項目做了改變后,會自動重載,不用重啟查看效果。我們會在應用開發過程中,保持著調試器在后臺運行。這能提供高效的開發環境。
4. 接著,我們創建一個Tornado 應用實例,把路由routes)和 settings 傳遞進去。
5. 最后,我們使用 python getbookmarks.py 命令啟動服務器去運行這個應用
打開 http://localhost:8888 和 http://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(已創建)。
最后一個后端功能是查看多帶帶的故事,我們首先指明路由:
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在構建應用之前,我們需要做些設置:
注冊一個OpenShift賬號。注冊是完全免費的,Red Hat給每個用戶三枚免費的Gear,可以用Gear運行你的應用。在寫作此文的時候,每個用戶能免費使用總共 1.5 GB 內存和 3 GB 硬盤空間。
安裝 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
使用 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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18695.html
摘要:今天的天學習種新技術挑戰,我決定使用框架和開發一個單頁面應用。應用我們將開發一個社交化書簽應用,允許用戶提交和分享鏈接。在元素中使用指令,意味著在整個中可用。我使用作為該應用的模塊名。 編者注:我們發現了有趣的系列文章《30天學習30種新技術》,正在翻譯,一天一篇更新,年終禮包。下面是第22天的內容。 今天的《30天學習30種新技術》挑戰,我決定使用Spring框架、MongoD...
介紹 官網文檔:http://apscheduler.readthedoc...API:http://apscheduler.readthedoc... APScheduler是一個python的第三方庫,用來提供python的后臺程序。包含四個組件,分別是: triggers: 任務觸發器組件,提供任務觸發方式 job stores: 任務商店組件,提供任務保存方式 executors: 任務...
摘要:在我的機子上,運行于端口,以避免和其他默認運行于端口的沖突。我們可以使用命令連接數據庫查看定義應用層次創建的模板應用有一個問題,客戶端和服務器段的代碼是一樣的。在中加入然后添加問題模板注意我們使用了來確保用戶未登錄的情況下應用。 編者注:我們發現了有趣的一系列文章《30天學習30種新技術》,正在翻譯中,一天一篇更新,年終禮包。下面是第15天的內容。 到目前為止我們討論了Bower...
摘要:在我的機子上,運行于端口,以避免和其他默認運行于端口的沖突。我們可以使用命令連接數據庫查看定義應用層次創建的模板應用有一個問題,客戶端和服務器段的代碼是一樣的。在中加入然后添加問題模板注意我們使用了來確保用戶未登錄的情況下應用。 編者注:我們發現了有趣的一系列文章《30天學習30種新技術》,正在翻譯中,一天一篇更新,年終禮包。下面是第15天的內容。 到目前為止我們討論了Bower...
摘要:推薦閱讀資源庫工具應用程序精選列表中文版有哪些鮮為人知,但是很有意思的網站一份攻城獅筆記每天搜集上優秀的項目一些有趣的民間故事超好用的谷歌瀏覽器油猴插件合集目錄資源文檔文章圖書會談教程更多庫工具管理數據部署桌面發展監控應用資源文檔介紹文檔教 推薦閱讀 MongoDB 資源、庫、工具、應用程序精選列表中文版 有哪些鮮為人知,但是很有意思的網站? 一份攻城獅筆記 每天搜集 Github ...
閱讀 3868·2021-07-28 18:10
閱讀 2577·2019-08-30 15:44
閱讀 1082·2019-08-30 14:07
閱讀 3455·2019-08-29 17:20
閱讀 1577·2019-08-26 18:35
閱讀 3533·2019-08-26 13:42
閱讀 1816·2019-08-26 11:58
閱讀 1585·2019-08-23 18:33