1. 程式人生 > >自定義session,cookie

自定義session,cookie

第一種情況:沒有設定快取:執行相對應的setitem等方法進行,儲存到字典裡面

cookies_dic={}
print(cookies_dic)
class Session():
def __init__(self,handler):
self.user_id=None
self.handler=handler###這個handler是傳過來的requetys物件,註明一下,這個handler是request物件

##接受到傳過來的引數
recv_user_id=self.handler.get_cookie('session_id')#去當前的requets物件裡面拿到這個session_id


print('檢視是否存在這個session_id',recv_user_id)
#進行判斷看是否是存在著的使用者,非法的使用者
if not recv_user_id :
##不存在的話,就是新使用者
self.user_id=self.create_random_str()
cookies_dic[self.user_id]={}
else:
##判斷是否是非法的使用者,存在user_id,單數不在cookies_dic裡面可以找的得到
if recv_user_id not in cookies_dic:
print('非法使用者')
self.user_id=self.create_random_str()

cookies_dic[self.user_id]={}
else:
print('正常')
print('檢視是否存在這個session_id', recv_user_id)

self.user_id=self.create_random_str()
import time
ctime=time.time()
self.handler.set_cookie('session_id',self.user_id,expires=ctime+3600)#設定cookies
##設定超時時間為30乘以60秒,就是30分鐘

def create_random_str(self):
import hashlib


m=hashlib.md5()

m.update(bytes(str(self.user_id),encoding='utf-8'))

return m.hexdigest()

def __setitem__(self, key, value):
##注意一下,這個handler是reqeuts物件,對cookie_dic進行設定
print('進行設定setitem')
print('這個key是',key)
print('value',value)
cookies_dic[self.user_id][key]=value######self是reqeust物件


def __getitem__(self, key):
return cookies_dic[self.user_id][key]


class FOO():
def initialize(self):
print('執行FOO函式')
self.session=Session(self)##傳入引數進去,requets
# super(FOO,self).initialize()


class HomeHandler(FOO,tornado.web.RequestHandler):
def get(self, *args, **kwargs):
print(self.session['user'])
print('進入到home頁面')
self.write('home')


class Login(FOO,tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.session['user']='yunxin'##當進行這個操作的時候,會進行setitem操作,key和vakue
self.session['status']='is_true'

self.redirect('/home')


import tornado.ioloop

application=tornado.web.Application([
(r'/login',Login),
(r'/home', HomeHandler),
])


application.listen(8000)
tornado.ioloop.IOLoop.instance().start()

 

 

 

 

第二種情況:可以設定快取,比如redis,或者是memcache等,儲存起來

'''
requets裡面封裝了cookie,還有session,requets.session,requets[session]
requets.set_cookie('sessioin_id','xxxxxxx',expire=60秒*多少)
requets.get_cookie('session_id')
'''
import tornado.web
import redis##可以儲存進redis裡面就進行快取
class Cache():
def __init__(self):
self.container={}
# redis.Redis(host=)
def __contains__(self, item):###傳過來的item是coookied_id,判斷這個使用者是否存在,如果存在的話,就返回true,到下面就是false
#判斷
if item in self.container:
return True
else:
return False








def set(self,cookie_id,key,value):
self.container[cookie_id]={}
self.container[cookie_id][key]=value
def delete(self,cookie_id,key):
del self.container[cookie_id][key]
def clear(self,cookie_id):
'''
清除整個使用者的cookies記錄
:return:
'''
del self.container[cookie_id]

def open(self,cookie_id):##cookies_di就是session_id,隨機字串
self.container[cookie_id]={}



class Session():
def __init__(self,handler):
self.user_id=None
self.handler=handler###這個handler是傳過來的requetys物件,註明一下,這個handler是request物件
self.start_base=Cache()
self.db=Cache()##拿到資料庫

##接受到傳過來的引數
recv_user_id=self.handler.get_cookie('session_id')#去當前的requets物件裡面拿到這個session_id
print('檢視是否存在這個session_id',recv_user_id)
#進行判斷看是否是存在著的使用者,非法的使用者
if not recv_user_id :
##不存在的話,就是新使用者
self.user_id=self.create_random_str()
self[self.user_id]={}
else:
##判斷是否是非法的使用者,存在user_id,單數不在cookies_dic裡面可以找的得到
if recv_user_id in self.start_base:
print('正常')
print('檢視是否存在這個session_id', recv_user_id)
self.user_id = self.create_random_str()
else:
print('非法使用者')
self.user_id = self.create_random_str()
# cookies_dic[self.user_id]={}
self.start_base.open(self.user_id) ##設定cookies值,存入資料庫裡面
# if self.start.initie(self.user_id) in

############將cookies儲存進creqeust.ccokies裡面
import time
ctime=time.time()
self.handler.set_cookie('session_id',self.user_id,expires=ctime+3600)#設定cookies,設定進request裡面
##設定超時時間為30乘以60秒,就是30分鐘

def create_random_str(self):
import hashlib
m=hashlib.md5()

m.update(bytes(str(self.user_id),encoding='utf-8'))

return m.hexdigest()

def __setitem__(self, key, value):
##注意一下,這個handler是reqeuts物件,對cookie_dic進行設定
print('進行設定setitem')
print('這個key是',key)
print('value',value)
# cookies_dic[self.user_id][key]=value######self是reqeust物件
self.start_base.set(self.user_id,key,value)##self.user_id就是session_id,儲存進來
'''
{隨機字串:{
key:value,}
隨機字串:{
key:value, key:value, key:value}
'''

def __getitem__(self, key):
# return cookies_dic[self.user_id][key]
return self.start_base.get(key)

def __delitem__(self, key):
self.start_base.delete(self.user_id,key)
def clear(self):
self.start_base.clear(self.user_id)

class FOO():
def initialize(self):
print('執行FOO函式')
self.session=Session(self)##傳入引數進去,requets
# super(FOO,self).initialize()


class HomeHandler(FOO,tornado.web.RequestHandler):
def get(self, *args, **kwargs):
print(self.session['user'])
print('進入到home頁面')
self.write('home')


class Login(FOO,tornado.web.RequestHandler):
def get(self, *args, **kwargs):
self.session['user']='yunxin'##當進行這個操作的時候,會進行setitem操作,key和vakue
self.session['status']='is_true'

self.redirect('/home')


import tornado.ioloop

application=tornado.web.Application([
(r'/login',Login),
(r'/home', HomeHandler),
])


application.listen(8000)
tornado.ioloop.IOLoop.instance().start()



'''
最開始設定的是session_id,儲存進request.session字典裡面
之後判斷是否存在這個session_id,在cookies裡面進行判斷,self.handler.get_cookie('session_id')
如果不存在的話,就是新使用者>>self.handler[session_id]={}
否則的話就進行判斷是否是正常的使用者
如果是非法的話,就進行重新設定cookie_id(也就是傳過來的session_id),self.handler[session_id]={}
如果是正常的話,就進行往下面執行>>不用設定
self.handler.set_cookie['session_id','xxxx',expire=60秒*多少)

最後設定session_id到cookie資料庫裡面,self.handler[session_id][key]=value,執行對應的setitem,delitem等方法
'''