今天的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/#/
这是今天的内容,继续给反馈吧。