>ä½ è¦æéä¼äººï¼å«ä»ä»¬é¡ºæä½å®çãææçï¼éµä»çå½ï¼é¢å¤è¡åæ ·çåäºãä¸è¦æ¯è°¤ï¼ä¸è¦äºç«ï¼æ»è¦åå¹³ï¼åä¼äººå¤§æ¾æ¸©æãæä»¬ä»å乿¯æ ç¥ï¼æéï¼åè¿·æï¼æä¾åæ ·ç§æ¬²åå®´ä¹ï¼å¸¸åæ¶æ¯ãå«å¦çå¿ï¼æ¯å¯æ¨çï¼åæ¯å½¼æ¤ç¸æ¨ãä½å°äºç¥æä»¬æä¸»çæ©æ åä»åäººææ½çæ ç±æ¾æçæ¶åï¼ä»ä¾¿æäºæä»¬ï¼å¹¶ä¸æ¯æä»¬èªå·±æè¡çä¹ï¼ä¹æ¯ç §çä»çææ¯ï¼èçéççæ´åå£çµçæ´æ°ã(TITUS 3:1-5) #ç¨tornadoåç½ç«(1) ä»ç°å¨å¼å§ï¼åä¸ä¸ªç½ç«ï¼å½ç¶ï¼è¿ä¸ªç½ç«åªè½ç®æ¯ä¸ä¸ªæ¯å¯çï¼å¯è½å¾ç®éï¼ä½æ¯ç½ç«ç主è¦å ç´ ï¼å®é½ä¼æ¶åå°ï¼è¯»è éè¿æ¤å¦ä¹ ï¼è½å¤äºè§£ç½ç«çå¼ååºæ¬ç»æåå 容ï¼å¹¶ä¸å¯¹åé¢çç¥è¯å¯ä»¥æç»¼ååºç¨ã ##åºæ¬ç»æ ä¸é¢æ¯ä¸ä¸ªç½ç«çåºæ¬ç»æ  **å端** è¿æ¯ä¸ä¸ªä¸å¾ä¸¥æ ¼ç说æ³ï¼ä½æ¯å¨æ¥å¸¸å¼åä¸ï¼é½è¿ä¹è¯´ãå¨ç½ç«ä¸ï¼æè°åç«¯å°±æ¯æç¨æµè§å¨æå¼ä¹åçå°çé£é¨åï¼å®æ¯åç°ç½ç«ä¼ è¿æ¥çä¿¡æ¯ççé¢ï¼ä¹æ¯ç¨æ·åç½ç«ä¹é´è¿è¡ä¿¡æ¯äº¤äºççé¢ãæ°åå端ï¼ä¸è¬ä½¿ç¨HTML/CSS/JSï¼å½ç¶ï¼éè¦ç¨pythonä¹ä¸æ¯ä¸å¯ä»¥ï¼ä¾å¦ä¸èä¸çä¾åï¼å°±æ²¡æç¨HTML/CSS/JSï¼ï¼ä½è¿å¿å¿ é æä»¥åç»´æ¤å°é¾ã MVCæ¨¡å¼æ¯ä¸ä¸ªé常好çè½¯ä»¶æ¶ææ¨¡å¼ï¼å¨ç½ç«å¼åä¸ï¼ä¹å¸¸å¸¸è¦æ±éµå®è¿ä¸ªæ¨¡å¼ã请é 读维åºç¾ç§çè§£éï¼ >MVC模å¼ï¼Model-View-Controllerï¼æ¯è½¯ä»¶å·¥ç¨ä¸çä¸ç§è½¯ä»¶æ¶ææ¨¡å¼ï¼æè½¯ä»¶ç³»ç»å为ä¸ä¸ªåºæ¬é¨åï¼æ¨¡åï¼Modelï¼ãè§å¾ï¼Viewï¼åæ§å¶å¨ï¼Controllerï¼ã >MVCæ¨¡å¼ææ©ç±Trygve Reenskaugå¨1978å¹´æåºï¼æ¯æ½ä¹å¸ç½å¥¥å¤ç ç©¶ä¸å¿ï¼Xerox PARCï¼å¨20ä¸çºª80年代为ç¨åºè¯è¨Smalltalkåæçä¸ç§è½¯ä»¶è®¾è®¡æ¨¡å¼ãMVC模å¼çç®çæ¯å®ç°ä¸ç§å¨æçç¨å¼è®¾è®¡ï¼ä½¿åç»å¯¹ç¨åºçä¿®æ¹åæ©å±ç®åï¼å¹¶ä¸ä½¿ç¨åºæä¸é¨åçéå¤å©ç¨æä¸ºå¯è½ã餿¤ä¹å¤ï¼æ¤æ¨¡å¼éè¿å¯¹å¤æåº¦çç®åï¼ä½¿ç¨åºç»ææ´å ç´è§ã软件系ç»éè¿å¯¹èªèº«åºæ¬é¨åå离çåæ¶ä¹èµäºäºåä¸ªåºæ¬é¨ååºæçåè½ãä¸ä¸äººåå¯ä»¥éè¿èªèº«çä¸é¿åç»ï¼ - ï¼æ§å¶å¨ Controllerï¼- è´è´£è½¬å请æ±ï¼å¯¹è¯·æ±è¿è¡å¤çã - ï¼è§å¾ Viewï¼ - çé¢è®¾è®¡äººåè¿è¡å¾å½¢çé¢è®¾è®¡ã - ï¼æ¨¡å Modelï¼ - ç¨åºåç¼åç¨åºåºæçåè½ï¼å®ç°ç®æ³ççï¼ãæ°æ®åºä¸å®¶è¿è¡æ°æ®ç®¡çåæ°æ®åºè®¾è®¡(å¯ä»¥å®ç°å ·ä½çåè½)ã æè°âå端âï¼å°±å¯¹å¤§æ¦å¯¹åºçViewé¨åï¼ä¹æä»¥è¯´æ¯å¤§æ¦ï¼å 为MVCæ¯ç«å¨ä¸ä¸ªè½¯ä»¶ç³»ç»çè§åº¦è¿è¡ååçï¼ä¸å¾ä¸çåå端ï¼ä¸å ¶è¯´æ¯ç³»ç»é¨åçååï¼ä¸å¦ä¸¥æ ¼è¯´æ¯ç³»ç»åè½çååã å端æå®ç°çåè½ä¸»è¦æï¼ - åç°å 容ãè¿äºå å®¹æ¯æ ¹æ®urlï¼ç±åç«¯ä»æ°æ®åºä¸æååºæ¥çãå端å°å ¶æç §ä¸å®çæ ·å¼åç°åºæ¥ãå¦å¤ï¼æä¸äºå 容ï¼ä¸æ¯åç«¯æ°æ®åºæä¾çï¼æ¯åå¨å端çã - ç¨æ·ä¸ç½ç«äº¤äºãç°å¨çç½ç«ï¼è¿æ¯å¿ é¡»çï¼æ¯å¦ç¨æ·ç»å½ãå½ç¨æ·å¨æå®çè¾å ¥æ¡ä¸è¾å ¥ä¿¡æ¯ä¹åï¼è¯¥ä¿¡æ¯å°±æ¯è¢«å端æäº¤ç»å端ï¼å端对è¿ä¸ªä¿¡æ¯è¿è¡å¤çä¹åï¼å¨ä¸è¬æ åµä¸é½è¦ååé¦ç»å端ä¸ä¸ªå¤çç»æï¼ç¶åå端åç°ç»ç¨æ·ã **å端** è¿éæè¯´çå端ï¼å¯¹åºçMVCä¸çControlleråModelçé¨åæè å ¨é¨åè½ï¼å ä¸ºå¨æä»¬çå¾ä¸ï¼âåç«¯âæ¯ä¸ä¸ªçéçæ¦å¿µï¼æ²¡æææ°æ®åºæ¾å¨å ¶å ã ä¸å¨è¿äºæ¯è¯ä¸çº ç»ã 卿们è¿éï¼å端就æ¯ç¨pythonåçç¨åºã主è¦ä»»å¡å°±æ¯æ ¹æ®éè¦å¤çç±å端åè¿æ¥çåç§è¯·æ±ï¼æ ¹æ®è¯·æ±çå¤çç»æï¼ä¸æ¹é¢æä½æ°æ®åºï¼å¯¹æ°æ®åºè¿è¡å¢å æ¹æ¥ï¼ï¼å¦å¤ä¸æ¹é¢æè¯·æ±çå¤çç»æåé¦ç»å端ã **æ°æ®åº** 工使¯è¾åä¸ï¼å°±æ¯é¢å¯¹å端çpythonç¨åºï¼ä»»å ¶å¢å æ¹æ¥ã å ³äºpythonå¦ä½æä½æ°æ®åºï¼å¨æ¬æç¨ç第贰å£ç¬¬æç« ä¸å·²ç»æè¯¦ç»çåè¿°ï¼è¯·è¯»è é è§ã ##ä¸ä¸ªåºæ¬æ¡æ¶ ä¸èä¸ï¼æ¾ç¤ºäºä¸ä¸ªåªè½æ¾ç¤ºä¸è¡åçç½ç«ï¼é£ä¸ªç½ç«ç±äºåè½å¤ªåä¸ï¼æææçä¸è¥¿é½åå°ä¸ä¸ªæä»¶ä¸ãå¨çæ£çå·¥ç¨å¼åä¸ï¼å¦æé£ä¹åï¼è½ç¶ä¸æ¯ä¸å¯ï¼ä½å¼åè¿ç¨ååæç»´æ¤ä¼éå°éº»ç¦ï¼ç¹å«æ¯ä¸ä¾¿äºå¤äººåä½ã æä»¥ï¼è¦åä¸ä¸ªåºæ¬æ¡æ¶ã以åç½ç«å°±å¨è¿ä¸ªæ¡æ¶ä¸å¼åã 建ç«ä¸ä¸ªç®å½ï¼å¨è¿ä¸ªç®å½ä¸å»ºç«ä¸äºåç®å½åæä»¶ã /. | handlers | methods | statics | templates | application.py | server.py | url.py è¿ä¸ªç»æå»ºç«å¥½ï¼å°±æå¼äºä¸ä¸ªåç½ç«çæ¶å¿ãæäºè¿ä¸ªæ¶å¿ï¼åé¢çäºæ å°±æ¯å¨è¿ä¸ªåºç¡ä¸æ·»å å ·ä½å 容äºãå½ç¶ï¼è¿å¯ä»¥ç¨å¦å¤ä¸ä¸ªæ´å¥½å¬çååï¼ç§°ä¹ä¸ºè®¾è®¡ã 便¬¡è¯´æä¸é¢çæ¶å¿ä¸æ¯ä¸ªç®å½åæä»¶çä½ç¨ï¼å½ç¶ï¼è¿ä¸ªä½ç¨æ¯æè§å®çï¼è¯»è å¦ææ¿æï¼ä¹å¯ä»¥æ ¹æ®èªå·±çææ¿æ¥ä»»æè®¾è®¡ï¼ï¼ - handlersï¼æåå¤å¨è¿ä¸ªæä»¶å¤¹ä¸æ¾åé¢æè¯´çå端pythonç¨åºï¼ä¸»è¦å¤çæ¥èªå端ç请æ±ï¼å¹¶ä¸æä½æ°æ®åºã - methodsï¼è¿éå夿¾ä¸äºå½æ°æè ç±»ï¼æ¯å¦ç¨çæå¤çè¯»åæ°æ®åºç彿°ï¼è¿äºå½æ°è¢«handlerséé¢çç¨åºä½¿ç¨ã - staticsï¼è¿éå夿¾ä¸äºéææä»¶ï¼æ¯å¦å¾çï¼cssåjavascriptæä»¶çã - templatesï¼è¿éæ¾æ¨¡æ¿æä»¶ï¼é½æ¯ä»¥html为æ©å±åçï¼å®ä»¬å°ç´æ¥é¢å¯¹ç¨æ·ã å¦å¤ï¼è¿æä¸ä¸ªpythonæä»¶ï¼ä¾æ¬¡åä¸å¦ä¸å 容ãè¿äºå 容çåè½ï¼å·²ç»å¨ä¸èä¸è®²è¿ï¼åªæ¯è¿éè¿è¡åé¨å«ç±»ã **url.py**æä»¶ #!/usr/bin/env python # coding=utf-8 """ the url structure of website """ import sys #utf-8ï¼å ¼å®¹æ±å reload(sys) sys.setdefaultencoding("utf-8") from handlers.index import IndexHandler #åè®¾å·²ç»æäº url = [ (r'/', IndexHandler), ] url.pyæä»¶ä¸»è¦æ¯è®¾ç½®ç½ç«çç®å½ç»æã`from handlers.index import IndexHandler`ï¼è½ç¶å¨handlersæä»¶å¤¹è¿æ²¡æä»ä¹ä¸è¥¿ï¼ä¸ºäºæ¼ç¤ºå¦ä½å»ºç«ç½ç«çç®å½ç»æï¼å设å¨handlersæä»¶å¤¹éé¢å·²ç»æäºä¸ä¸ªæä»¶index.pyï¼å®éé¢è¿æä¸ä¸ªç±»IndexHandlerãå¨url.pyæä»¶ä¸ï¼å°å ¶å¼ç¨è¿æ¥ã åéurlæåä¸ä¸ªå表ï¼å¨å表ä¸ååºææç®å½å对åºçå¤çç±»ãæ¯å¦`(r'/', IndexHandler),`ï¼å°±æ¯çº¦å®ç½ç«æ ¹ç®å½çå¤çç±»æ¯IndexHandlerï¼å³æ¥èªè¿ä¸ªç®å½çget()æè post()请æ±ï¼åæIndexHandlerç±»ä¸ç¸åºæ¹æ³æ¥å¤çã å¦æè¿æå«çç®å½ï¼å¦æ³ç®å¶ã **application.py**æä»¶ #!/usr/bin/env python # coding=utf-8 from url import url import tornado.web import os settings = dict( template_path = os.path.join(os.path.dirname(__file__), "templates"), static_path = os.path.join(os.path.dirname(__file__), "statics") ) application = tornado.web.Application( handlers = url, **settings ) ä»å 容ä¸å¯ä»¥çåºï¼è¿ä¸ªæä»¶å®æäºå¯¹ç½ç«ç³»ç»çåºæ¬é ç½®ï¼å»ºç«ç½ç«ç请æ±å¤çéåã `from url import url`æ¯å°url.pyä¸è®¾å®çç®å½å¼ç¨è¿æ¥ã settingå¼ç¨äºä¸ä¸ªåå ¸å¯¹è±¡ï¼éé¢çº¦å®äºæ¨¡æ¿åéææä»¶çè·¯å¾ï¼å³å£°æå·²ç»å»ºç«çæä»¶å¤¹"templates"å"statics"åå«ä¸ºæ¨¡æ¿ç®å½åéææä»¶ç®å½ã æ¥ä¸æ¥çapplicationå°±æ¯ä¸ä¸ªè¯·æ±å¤çéå对象ã请注æ`tornado.web.Application()`çåæ°è®¾ç½®ï¼ >tornado.web.Application(handlers=None, default_host='', transforms=None, **settings) å ³äºsettingsç设置ï¼ä¸ä» ä» æ¯æä»¶ä¸ç两个ï¼è¿æå ¶å®ï¼æ¯å¦ï¼å¦æå¡«ä¸`debug = True`就表示åºäºè°è¯æ¨¡å¼ãè°è¯æ¨¡å¼ç好å¤å°±å¨äºæå©äºå¼åè°è¯ï¼ä½æ¯ï¼å¨æ£å¼é¨ç½²çæ¶åï¼æå¥½ä¸è¦ç¨è°è¯æ¨¡å¼ãå ¶å®æ´å¤çsettingså¯ä»¥åç宿¹ææ¡£ï¼[tornado.web-RequestHandler and Application classes](http://tornado.readthedocs.org/en/latest/web.html) **server.py**æä»¶ è¿ä¸ªæä»¶çä½ç¨æ¯å°tornadoæå¡å¨è¿è¡èµ·æ¥ï¼å¹¶ä¸åæ¬åé¢ä¸¤ä¸ªæä»¶ä¸çå¯¹è±¡å±æ§è®¾ç½®ã #!/usr/bin/env python # coding=utf-8 import tornado.ioloop import tornado.options import tornado.httpserver from application import application from tornado.options import define, options define("port", default = 8000, help = "run on the given port", type = int) def main(): tornado.options.parse_command_line() http_server = tornado.httpserver.HTTPServer(application) http_server.listen(options.port) print "Development server is running at http://127.0.0.1:%s" % options.port print "Quit the server with Control-C" tornado.ioloop.IOLoop.instance().start() if __name__ == "__main__": main() æ¤æä»¶ä¸çå 容ï¼å¨[ä¸è](./302.md)å·²ç»ä»ç»ï¼ä¸åèµè¿°ã 妿¤è¿è¬ï¼å°±å®æäºç½ç«æ¶å¿çæå»ºã åé¢è¦åçæ¯åé颿·»å å 容ã ------ [æ»ç®å½](./index.md) | [ä¸èï¼åæHello](./302.md) | [ä¸èï¼ç¨tornadoåç½ç«(2)](./304.md) å¦æä½ è®¤ä¸ºæå¿ è¦æèµæï¼è¯·éè¿æ¯ä»å®ï¼**[email protected]**,ä¸èææ¿ã