tornado session

[轉]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()
相關文章
相關標籤/搜索