[轉]tornado入門 - session
cookie 和session 的區別:html
一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。web
二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。redis
三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能
考慮到減輕服務器性能方面,應當使用COOKIE。瀏覽器
四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。安全
五、因此我的建議:
將登錄信息等重要信息存放爲SESSION
其餘信息若是須要保留,能夠放在COOKIE中服務器
建立惟一標識符cookie
import uuid uuid.uuid4()
tornado默認沒有支持sessionsession
須要安裝第三方app
安裝Redis 和 pyckettornado
pip install pycket
使用pycket實現基於redis的session
例子
#-*- coding: utf-8 -*- import tornado.httpserver import tornado.ioloop import tornado.web import os import tornado.autoreload from tornado.options import define, options #2 導入模塊 from pycket.session import SessionMixin define('port', default=8000, help='Run on the given port', type=int) define('debug', default=False, help='Set debug mode', type=bool) class HomeHandler(tornado.web.RequestHandler): def get(self, *args, **kwargs): self.render('index.html') #3 在使用session的handler上繼承SessionMixin class LoginHandler(tornado.web.RequestHandler, SessionMixin): def get(self, *args, **kwargs): self.render('login.html') def post(self, *args, **kwargs): self.set_secure_cookie('user', self.get_argument('user', None)) #4設置session self.session.set('user_session_test', self.get_argument('user')) txt = str(self.session.get('user_session_test')) #4測試session self.write('Successully set cookie!, user_session_test value: %s' % txt) class OtherHtmlHandler(tornado.web.RequestHandler): def get_current_user(self): user = self.get_secure_cookie('user') return user @tornado.web.authenticated def get(self, page): pagename = page + '.html' path = os.path.join(self.settings['static_path'], pagename) self.render(pagename) class CustomApp(tornado.web.Application): def __init__(self, debug = False): settings = { 'template_path':os.path.join(os.path.dirname(__file__), 'moban_clean/templates'), 'static_path':os.path.join(os.path.dirname(__file__), 'moban_clean'), 'blog_title': "tornado blog", 'login_url': '/login.html', 'cookie_secret':"2379874hsdhf0234990sdhsaiuofyasop977djdj", 'xsrf_cookies':True, 'debug':debug, #1 配置pycket 注意別忘記開啓redis服務C:\redis>redis-server.exe 'pycket':{ 'engine':'redis', 'storage':{ 'host':'localhost', 'port': 6379, 'db_sessions':10, 'db_notifications':11, 'max_connections':2**31, }, 'cookies':{ #5 設置過時時間 'expires_days':2, #'expires':None, #秒 }, } } handles = [ (r'/$', HomeHandler), (r'/login.html', LoginHandler), (r'/(.+?)\.html', OtherHtmlHandler), (r'/(.+?\..+)', tornado.web.StaticFileHandler, dict(path=settings['static_path'])), ] super(CustomApp, self).__init__(handles, **settings) if __name__ == '__main__': tornado.options.parse_command_line() app = CustomApp(debug=options.debug) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) #tornado.autoreload.start() tornado.ioloop.IOLoop.instance().start()