Tornado框架
Tornado介紹
Tornado?是?FriendFeed?使用的可擴展的異步非阻塞式?web?服務器及其相關工具的開源版本。這個?Web?框架看起來有些像web.py(豆瓣用這個寫的) 或者?Google?的?webapp,不過為了能有效利用非阻塞式服務器環境,這個?Web?框架還包含了一些相關的有用工具?和優化。
Tornado?和現在的主流?Web?服務器框架(包括大多數?Python?的框架)有著明顯的區別:它是非阻塞式服務器,而且速度相當快。得利于其?非阻塞的方式和對?epoll?的運用,Tornado?每秒可以處理數以千計的連接,這意味著對于實時?Web?服務來說,Tornado?是一個理想的?Web?框架。我們開發這個?Web?服務器的主要目的就是為了處理?FriendFeed?的實時功能?——在?FriendFeed?的應用里每一個活動用戶都會保持著一個服務器連接。(關于如何擴容?服務器,以處理數以千計的客戶端的連接的問題,請參閱?C10K?problem。)
基本使用?
| 12345678910111213141516171819 | #!/usr/bin/env python# -*- coding:utf-8 -*-???import tornado.ioloopimport tornado.web??????class MainHandler(tornado.web.RequestHandler):????def get(self): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #根據請求method,通過反射找到get方法;????????self.write("Hello, world")???application = tornado.web.Application([????(r"/index", MainHandler), ? ? ? ? ? ? ? ? ? ?#一個映射對應一個類])??????if __name__ == "__main__":????application.listen(8888) ? ? ? ? ? ? ? ? ? ? #socket????tornado.ioloop.IOLoop.instance().start() |
第一步:執行腳本,監聽?8888?端口
第二步:瀏覽器客戶端訪問?/index??-->??http://127.0.0.1:8888/index
第三步:服務器接受請求,并交由對應的類處理該請求
第四步:類接受到請求之后,根據請求方式(post?/?get?/?delete?...)的不同調用并執行相應的方法
第五步:方法返回值的字符串內容發送瀏覽器
詳細介紹
一、路由系統?
路由系統其實就是?url?和?類?的對應關系,這里不同于其他框架,其他很多框架均是?url?對應?函數,Tornado中每個url對應的是一個類。
| 12345678910111213141516171819202122232425262728293031 | #!/usr/bin/env python# -*- coding:utf-8 -*-???import tornado.ioloopimport tornado.web??????class MainHandler(tornado.web.RequestHandler):????def get(self):????????self.write("Hello, world")???class StoryHandler(tornado.web.RequestHandler):????def get(self, story_id):????????self.write("You requested the story " + story_id)???class BuyHandler(tornado.web.RequestHandler):????def get(self):????????self.write("buy.wupeiqi.com/index")???application = tornado.web.Application([????(r"/index", MainHandler),????(r"/story/([0-9]+)", StoryHandler),])???application.add_handlers('buy.wupeiqi.com$', [????(r'/index',BuyHandler),])???if __name__ == "__main__":????application.listen(80)????tornado.ioloop.IOLoop.instance().start() |
二、模板
三、實用功能
四、擴展功能
1、自定義session
2、自定義模型綁定
表單提交驗證
用戶輸入與對象正則表達式的字段進行匹配,沒錯誤返回True。
template/index.html
| 12345678910111213141516171819 | <!DOCTYPE html><html><head lang="en">????<meta charset="UTF-8">????<title></title>????<link href="{{static_url("commons.css")}}" rel="stylesheet" /></head><body>????<h1>hello</h1>????<form action="/index" method="post">????????<p>hostname: <input type="text" name="host" /> </p>????????<p>ip: <input type="text" name="ip" /> </p>????????<p>port: <input type="text" name="port" /> </p>????????<p>phone: <input type="text" name="phone" /> </p>????????<input type="submit" />????</form></body></html> |
index.py
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 | #!/usr/bin/env python# -*- coding:utf-8 -*-???import tornado.ioloopimport tornado.webimport re??????class MainForm(object):????def __init__(self):????????self.host = "(.*)"????????self.ip = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$"????????self.port = '(\d+)'????????self.phone = '^1[3|4|5|8][0-9]\d{8}$'???????def check_valid(self, request):????????form_dict = self.__dict__?? #獲取這個對象的所有字段????????for key, regular in form_dict.items():????????????post_value = request.get_argument(key)????????????#get_argument()是request方法,獲取html表單中name就是key,所以這個字段名稱和name最好對應????????????# 讓提交的數據 和 定義的正則表達式進行匹配,只能用match,從頭匹配????????????ret = re.match(regular, post_value)????????????if not ret:????????????????return False????????return True??????class MainHandler(tornado.web.RequestHandler):????def get(self):????????self.render('index.html',name="test")????def post(self, *args, **kwargs):????????obj = MainForm()????????result = obj.check_valid(self)????????print result??? #全部輸入正確就是True????????self.write('ok')?????????settings = {????'template_path': 'template',????'static_path': 'static',????'static_url_prefix': '/static/',}???application = tornado.web.Application([????(r"/index", MainHandler),], **settings)????? #路由系統,應用配置settings,靜態文件會去template目錄里找;??????if __name__ == "__main__":????application.listen(8888)????tornado.ioloop.IOLoop.instance().start() |
來自為知筆記(Wiz)
轉載于:https://www.cnblogs.com/daliangtou/p/5370873.html
總結
- 上一篇: 如何预防不孕症的发生
- 下一篇: 爱上一个大我十岁的女子