1.tornado是一個異步的http框架
2.常用模塊
importtornado.httpserver
importtornado.ioloop
importtornado.options
importtornado.web
這四個都是 Tornado 的模塊绰筛,在本例中都是必須的篙贸。它們四個在一般的網站開發(fā)中隆夯,都要用到吆视,基本作用分別是:
tornado.httpserver:這個模塊就是用來解決 web 服務器的 http 協(xié)議問題报咳,它提供了不少屬性方法抖部,實現(xiàn)客戶端和服務器端的互通鹰服。Tornado 的非阻塞、單線程的特點在這個模塊中體現(xiàn)眼俊。
tornado.ioloop:這個也非常重要意狠,能夠實現(xiàn)非阻塞 socket 循環(huán),不能互通一次就結束疮胖。
tornado.options:這是命令行解析模塊环戈,也常用到。
tornado.web:這是必不可少的模塊澎灸,它提供了一個簡單的 Web 框架與異步功能院塞,從而使其擴展到大量打開的連接,使其成為理想的
3.優(yōu)化路徑击孩,處理post,get請求
import textwrap
import os
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class ReverseHandler(tornado.web.RequestHandler):
? ? ?def get(self, input):
? ? ? ? ?self.write(input[::-1])
class WrapHandler(tornado.web.RequestHandler):
? ? def post(self):
? ? ? ? text = self.get_argument('text')
? ? ? ? width = self.get_argument('width', 40)
? ? ? ? self.write(textwrap.fill(text, int(width)))
if __name__ == "__main__":
????#解析命令行參數(shù)
? ? tornado.options.parse_command_line()
????#創(chuàng)建應用程序
? ? app = tornado.web.Application(
? ? ? ? handlers=[
? ? ? ? ? ? #(r"/reverse/(\w+)", ReverseHandler),
? ? ? ? ? ? (r"/", ReverseHandler),
? ? ? ? ? ? (r"/wrap", WrapHandler)
? ? ? ? ],
? ? ? ? template_path=os.path.join(os.path.dirname(__file__),'templates'),
? ? ? ? debug=True
? ? )
????#設置http服務器
? ? http_server = tornado.httpserver.HTTPServer(app)
? ??#設置監(jiān)聽端口
? ? http_server.listen(options.port)
? ? tornado.ioloop.IOLoop.instance().start()
4.關聯(lián) 模板
import textwrap
import os
import tornado.web
from tornado.options import define, options
define("port", default=5678, help="run on the given port", type=int)
#自定義方法
def defiend(str):
? ? return '<<%s>>'% str
class BookHandler(tornado.web.RequestHandler):
? ? def get(self):
? ? ? ? title = self.get_argument('title',)
? ? ? ? self.render(
? ? ? ? ? ? 'book.html',
? ? ? ? ? ? title=title,
? ? ? ? ? ? header="books",
? ? ? ? ? ? books=[
? ? ? ? ? ? ? ? 'baiduren',
? ? ? ? ? ? ? ? 'huozhe',
? ? ? ? ? ? ? ? 'xiaowangzi'
? ? ? ? ? ? ],
? ? ? ? ? ? tag=defiend
? ? ? ? )
if __name__ == "__main__":
? ? tornado.options.parse_command_line()
? ? app = tornado.web.Application(
? ? ? ? handlers=[
? ? ? ? ? ? (r"/", BookHandler),
? ? ? ? ],
? ? ? ? #設置文件路徑
? ? ? ? template_path=os.path.join(os.path.dirname(__file__),'templates'),
? ? ? ? debug=True
? ? )
? ? http_server = tornado.httpserver.HTTPServer(app)
? ? http_server.listen(options.port)
? ? tornado.ioloop.IOLoop.instance().start()
5.模板繼承,主要在html頁面
? ? ? ? {%block header%}
? ? ? ? ? ? this is header
? ? ? ? {%end%}
? ? ? ? {%block content%}
? ? ? ? ? ? this is content
? ? ? ? {%end%}
? ? ? ? {%block footer%}
? ? ? ? ? ? this is footer
? ? ? ? {%end%}
6.tornado設置cookie
#-*- coding:utf-8 -*-
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.options
import os.path
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class BaseHandler(tornado.web.RequestHandler):
? ? #重寫父類的方法鹏漆,如果返回的是真值的說明登錄成功
? ? def get_current_user(self):
? ? ? ? print("get current user")
? ? ? ? return self.get_secure_cookie("username")
class LoginHandler(BaseHandler):
? ? def get(self):
? ? ? ? self.render('cookie_login.html')
? ? def post(self):
? ? ? ? #設置cookie(標記已經登錄)
? ? ? ? self.set_secure_cookie("username", self.get_argument("username"))
? ? ? ? self.redirect("/")
class WelcomeHandler(BaseHandler):
? ? @tornado.web.authenticated
? ? def get(self):
? ? ? ? self.render('cookie_index.html', user=self.current_user)
#清除cookie
class LogoutHandler(BaseHandler):
? ? def get(self):
? ? ? ? if (self.get_argument("username", None)):
? ? ? ? ? ? self.clear_cookie("username")
? ? ? ? ? ? self.redirect("/")
if __name__ == "__main__":
? ? tornado.options.parse_command_line()
? ? settings = {
? ? ? ? "template_path": os.path.join(os.path.dirname(__file__), "templates"),
? ? ? ? "cookie_secret": "bZJc2sWbQLKos6GkHn/VB9oXwQt8S0R0kRvJ5/xJ89E=",
? ? ? ? #設置xsrf防跨站攻擊
? ? ? ? "xsrf_cookies": True,
? ? ? ? "login_url": "/login"
? ? }
? ? application = tornado.web.Application([
? ? ? ? (r'/', WelcomeHandler),
? ? ? ? (r'/login', LoginHandler),
? ? ? ? (r'/logout', LogoutHandler)
? ? ], **settings)
? ? http_server = tornado.httpserver.HTTPServer(application)
? ? http_server.listen(options.port)
? ? tornado.ioloop.IOLoop.instance().start()