今天的30天挑戰,我決定先暫停JavaScript,學習一款叫Tornado的web框架。學Tornado是爲了能用Python開發web程序,我只會Flask框架,因此學Tornado能好好補充一下個人Python web開發技能。本文咱們要開發的程序會用到Tornado做爲REST後端,MongoDB數據庫,AngularJS爲客戶端JavaScript MV*框架,OpenShift做爲部署平臺。javascript
Tornado是一個開源的Python Web框架,也是非阻塞式web服務,最初在FriendFeed開發。FriendFeed被收購後,由Facebook維護和開發。因爲它的非阻塞式的網絡I/O特點,有高超的可擴展性,能同時檢測上千的併發鏈接。 css
本文咱們開發個網摘程序容許用戶發佈和分享連接,你能夠查看OpenShift在線程序,和第22天的同樣,能夠參考以前的用例來了解。 html
今天的demo放在 github: day25-tornado-demo-app. 前端
在開始用Tornado以前,咱們須要安裝Python和virtualenv, 本文我用的Python版本是2.7. java
這個程序須要用MongoDB做數據存儲,請下載最新MongoDB. python
咱們用pip安裝開始,對於不瞭解pip的讀者,pip是一個Python包管理。咱們能夠從官網下載pip,在你係統上任意合適路徑運行如下命令。git
$ mkdir getbookmarks $ cd getbookmarks $ virtualenv venv --python=python2.7 $ . venv/bin/activate $ pip install tornado $ pip install pymongo
以上代碼會在本機建立一個getbookmarks目錄,而後用2.7的Python激活virtualenv,再安裝tornado包,最後安裝pymongo. Pymongo是官方MongoDB Python驅動,用來寫Stories到MongoDB.angularjs
在getbookmarks文件夾下新建getbookmarks.py文件。github
$ touch getbookmarks.py
複製如下代碼粘貼到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()
以上代碼:
用如下命令運行程序,查看 http://localhost:8888 和 http://localhost:8888/index, 確保能看到"Hello World!".
$ python getbookmarks.py
導入庫後添加如下幾行,咱們定義了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]
咱們建立了一個MongoClient實例,傳給鏈接url, 這會鏈接到運行的MongoDB實例,接下來用MongoClient實例獲取數據庫。
如今來加新建和顯示文章的功能,先加以下路由到程序實例。
application = web.Application([ (r'/', IndexHandler), (r'/index', IndexHandler), (r'/api/v1/stories',StoriesHandler), ],**settings)
而後定義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)
以上代碼:
最後一個後臺宮呢功能是查看獨立文章,先指定路由。
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響應。
我決定繼續用第22天寫的AngularJS前端,第22天展現了怎樣用AngualrJS和Java Spring框架,用JavaScript MV*框架最好的是若是你繼續堅持REST客戶端界面需求,那你能夠重用前端代碼。詳情請參考第22天博客。
你能夠從個人github下載AngularJS前端,複製static和templates文件夾到getbookmarks.py後面。
在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/#/
這是今天的內容,繼續給反饋吧。