Tornado中的cookies與session的設定
阿新 • • 發佈:2018-11-25
1.在帶有(繼承)自RequestHandler的類中
#設定
self.set_cookie('mycookie','hello_world',expires_days=10)#10天過期
#獲取
info = self.get_cookie('mycookie')
2.由於tornado框架沒有實現session的機制,我們就可以自己建立類來實現
#僅供參考 #MySeesion用來儲存客戶端資訊 #儲存格式: # 鍵 id # 值 {} #記錄使用者的行為 # 1345682423894:{'islogin':'True'} # 192391280389e:{'aaa':'bbb','ccc':'ddd'} from day0201.util.myutils import myuuid session={} #模擬實現session機制 class MySession: def __init__(self,handler): #必須傳遞一個handler物件,才能在下面使用get_cookie()方法去實現 self.handler = handler def __getitem__(self, key): id = self.handler.get_cookie('cookieid') if id: #根據id取出對應的儲存在伺服器上的資訊 info = session.get(id,None) if info: return info.get(key,None) else: return None else: return None def __setitem__(self, key, value): id = self.handler.get_cookie('cookieid') if id: info = session.get(id,None) if info: info[key] = value else: d = dict() d[key] = value session[id] = d else: d = dict() d[key] = value #為客戶端指定一個uuid充當id值 id = myuuid() #這是一個具體的演算法 session[id] = d #並將id以cookie的形式寫回給瀏覽器 self.handler.set_cookie('cookieid',id,expires_days=10)
以上session來時一個tornado的部落格專案,完整的程式碼可以參見github地址
3.前端的實現
首先檢測,如果登入則直接跳轉到部落格頁
class IndexHandler(MyRequestHandler): def initialize(self): print('initialize方法執行') #響應以get方式發起的請求 def get(self, *args, **kwargs): print('get方法執行') print('uuid值------>',myuuid()) #給瀏覽器一個cookie self.set_cookie('mycookie','hello_world',expires_days=10)#10天過期 #session = MySession(self) islogin = self.session['islogin'] if islogin: self.redirect('/blog') else: #伺服器給瀏覽器的響應內容 self.render('login.html') #響應以post方式發起的請求 def post(self, *args, **kwargs): pass def on_finish(self): print('on_finish方法執行')
部落格頁,如果沒有登入,則跳轉到登入頁
class BlogHandler(MyRequestHandler): def my_rand(self,a,b): return random.randint(a,b) def get(self, *args, **kwargs): #session = MySession(self) islogin = self.session['islogin'] if islogin: self.render('blog.html') else: self.redirect('/') def post(self, *args, **kwargs): pass
class LoginHandler(MyRequestHandler):
def get(self, *args, **kwargs):
pass
def post(self, *args, **kwargs):
name = self.get_body_argument('name',None)
password = self.get_body_argument('password',None)
if self.application.dbutil.isloginsuccess(name,password):
#登入成功我要在session中進行記錄
#session = MySession(self)
self.session['islogin'] = True
self.redirect('/blog')
else:
self.redirect('/?msg=fail')
其中的myRequestHandler是對requestHandler的再一次分裝,不過的注意這個__init__()的引數傳遞
from tornado.web import RequestHandler
from day0201.util.mysession import MySession
class MyRequestHandler(RequestHandler):
def __init__(self,application, request, **kwargs):
super().__init__(application, request, **kwargs)
self.session = MySession(self)