文章目錄
- 起因:
- 從DEMO開始:
- url映射:
- 輸出Response:
- 非同步訪問:
- 目的:
起因:今年春節後發現有個tornado web的東西,app server+web framework的集合體,正好工作中有個項目需要其中的非同步遠程調用的特性,遂研究之,用到現在感觸良多,其效能尚可,但是作為Web Framework看來其封裝方式我並不喜歡,竊以為不夠緊湊,需要設定的地方不夠清晰,很多功能的使用稍顯繁瑣。並且在新建立一個app的時候如果不參看已有的app做為參考,重頭寫起來很困難。舉個例子 :代碼 1
2 import tornado.httpserver
3 import tornado.ioloop
4 import tornado.options
5 import tornado.web
6
7 from tornado.options import define, options
8
9 define("port", default=8888, help="run on the given port", type=int)
10
11 class MainHandler(tornado.web.RequestHandler):
12 def get(self):
13 self.write("Hello, world")
14
15 def main():
16 tornado.options.parse_command_line()
17 application = tornado.web.Application([
18 (r"/", MainHandler),
19 ])
20 http_server = tornado.httpserver.HTTPServer(application)
21 http_server.listen(options.port)
22 tornado.ioloop.IOLoop.instance().start()
23
24 if __name__ == "__main__":
25 main()
26
從官網的例子就能看出,首先啟動一個服務就很麻煩了,加之Python在開發的時候智能感知能起的作用不是很大,所以開發起來相當的糾結。而且其中我最需要的遠程頁面非同步訪問的功能,就需要涉及到N個地方。最近新出的Flask,Bottle等架構簡潔的API讓我很是眼熱,但是如果在tornado後端用wsgi來使用Bottle又沒有辦法使用非同步遠端存取,相當於閹割了一個我最需要的功能,所以怒由心中起惡向膽邊生,自起爐灶在tornado的Web Framework基礎上實現了這個東西,由於是簡化了tornado的開發方式,所以就稱之為 easytor 吧從DEMO開始:同樣是實現一個HelloWorld的APP,我們用easytor來做做看:easytor只有一個檔案,你可以直接放在項目的目錄中,或者安裝後使用1 from easytor.app import apprun,route
2
3 @route("^/hello/([^/]+)$")
4 def hello(tor,name):
5 return u"hello %s"%name
6
7 if __name__=="__main__":
8 apprun()
我們import easytor.app模組中的 apprun和route,apprun是啟動伺服器的方法,而route是一個Decorator,用來把一個handler函數和映射到的url一起註冊到easytor的處理器列表中。url映射:easytor中定義了很多Decorator,用於註冊一些特定方法並掛載到相應的事件中。最重要的就是route。用route註冊的函數至少有一個參數,第一個參數是tornado的handler對象,訪問參數,headers,cookie,是從這個參數開始,詳細的內容參見tornado的文檔。url映射通過route這個Decorator來註冊,同時route還可以通過參數指定訪問這個url是否需要認證,是否是Ajax請求和接受請求的方法。route可以將Regex中的組取出來成為Handler函數的參數,如同Demo裡那樣,如果訪問/hello/alex,就顯示 hello alex輸出Response:easytor通過Handler函數的傳回值向瀏覽器輸出內容,傳回值可以是str,unicode,或者幾個封裝類,json,view,static_file,redirect,remote,async。執行個體化後將執行個體直接return 即可。比如要輸出json,只需要1 return json(dict(name="alex"))
view用於封裝render輸出資料到模板。redirect用於專跳頁面。remote是對遠程非同步擷取頁面的封裝async是一個空封裝,用於掛起當前的請求(詳見tornado的Demo:chat)非同步訪問:非同步訪問通過remote類來實現,看下面的例子:1 @route("^/remoteacc$")
2 def get_page(tor):
3 return remote("http://target..",method="GET",)
4
5 def on_get_page(tor,response):
6 return response.body
對比tornado原本的例子,可以看到整個API簡單了不少目的:少寫代碼,少寫代碼,還是少寫代碼項目地址:http://bitbucket.org/alexander_lee/easytor如果你也在用,或者打算用tornado來構建自己的Web應用,不妨試試easytor同時也期待你的加入PS:項目文檔整理中,DEMO正在寫,代碼8號中午push上來
下一步目標:植入Session支援的擴充介面,加入fsdal代替tornado本身的資料訪問模組