• 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()

    执行流程讲解:
    首先当你访问某个页面的时候,比如login的页面的时候,会设置session访问的用户,和状态(在注册的时候就已经设置
    了该用户session到服务器里面),然后会走到index页面,此时已经带有session之后的值了,request.session['user']已经
    设置好值了,然后当执行父类的方法的时候,就会设置cookie,首先进行判断,是否该用户是已经存在的用户,在cookie
    缓存数据库里面,reqeust.get_cookie('session_id'),如果不存在的话,就创建改用户的cookie缓存,dic['session_id']={}
    如果存在的话,就进行判断看改用户是否是非法的(就是说session_id存在,但是不匹配里面的cookie数据库),所以也被被认为
    不存在改用户,所以创建改用户的cookie数据库,当在cookie数据库里面存在改过来访问的session_id的时候,就说明是已经匹配
    成功了,就执行下面的步骤
    reqeust.set_cookie('session_id','xxxxx',expires=60*多少),保存到requets.cookies里面
    保存到cookie数据库里面:
    执行相对应的方法:setitem,getitem,delitem,clear等,cookie_dic['session_id'][key]=value
    具体图解:
    {
    session_id(不同随机字符串,加密处理的):{user:'yunxin','xx':'xxxx'},
    session_id(不同随机字符串,加密处理的):{user:'xiaoha','xx':'xxxx'},
    session_id(不同随机字符串,加密处理的):{user:'xiaoyun','xx':'xxxx'},
    session_id(不同随机字符串,加密处理的):{user:'xaiowu','xx':'xxxx'},
    session_id(不同随机字符串,加密处理的):{user:'xiaoli','xx':'xxxx'},
    }

    第二种情况:可以设置缓存,比如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 get(self,cookie_id,key):
    print('拿到cooie数据库里面的值:',self.container)
    print('get里面的方法',key)
    return self.container[cookie_id][key]


    def set(self,cookie_id,key,value):
    self.container[cookie_id]={}
    self.container[cookie_id][key]=value
    print('设置cookie成功',self.container)
    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):##handler是传过来的self参数
    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+1800)#设置cookies,设置进request里面
    ##设置时间为30乘以60秒,就是30分钟
    print('*'*100)

    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):####这个self是login的方法,谁调用了他就是谁
    ##注意一下,这个handler是reqeuts对象,对cookie_dic进行设置
    print('进行设置setitem')
    print('这个key是',key)
    print('value',value)

    # cookies_dic[self.user_id][key]=value######self是谁访问的
    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(self.user_id,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):##initialize这个自动执行
    print('执行FOO函数')
    self.session=Session(self)##传入参数进去,看是谁访问的,进行了一步封装,将session封装到了self,就是Session函数里面
    # super(FOO,self).initialize()


    class HomeHandler(FOO,tornado.web.RequestHandler):#####先执行父类的方法
    def get(self, *args, **kwargs):
    print('看一下,这个self是',self.session)
    print(self.session['user'])
    if self.session['user']:
    print('进入到home页面')
    self.write('home')
    else:
    self.write('没有用户登录,请去登录')

    class Login(FOO,tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
    self.session['user']='yunxin'##当进行这个操作的时候,会进行setitem操作,key和vakue,是在这里进行设置的setitem方法
    self.session['status']='is_true'
    print('原来的self是',self.session)
    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等方法
    '''

    结果:

    D:condapython.exe D:/pycharm源代码/Tonardo/session/自写session.py
    执行FOO函数
    查看是否存在这个session_id None
    进行设置setitem
    这个key是 6adf97f83acf6453d4a6a4b1070f3754
    value {}
    设置cookie成功 {'6adf97f83acf6453d4a6a4b1070f3754': {'6adf97f83acf6453d4a6a4b1070f3754': {}}}
    ****************************************************************************************************
    进行设置setitem
    这个key是 user
    value yunxin
    设置cookie成功 {'6adf97f83acf6453d4a6a4b1070f3754': {'user': 'yunxin'}}
    进行设置setitem
    这个key是 status
    value is_true
    设置cookie成功 {'6adf97f83acf6453d4a6a4b1070f3754': {'status': 'is_true'}}
    原来的self是 <__main__.Session object at 0x00000266B61C53C8>
    执行FOO函数
    查看是否存在这个session_id 6adf97f83acf6453d4a6a4b1070f3754
    非法用户
    ****************************************************************************************************
    看一下,这个self是 <__main__.Session object at 0x00000266B61C56A0>
    拿到cooie数据库里面的值: {'6adf97f83acf6453d4a6a4b1070f3754': {}}
    get里面的方法 user

  • 相关阅读:
    数据结构----字典及部分知识总结(2018/10/18)
    数据结构----链表的逆置及链表逆置和删除极小值
    Python自学知识点----Day03
    Python自学知识点----Day02
    Python自学知识点----Day01
    课堂笔记及知识点----树(2018/10/24(pm))
    课堂笔记及知识点----栈和队列(2018/10/24(am))
    数据结构----链表的删除和遍历(2018/10/24)
    数据结构----顺序表的增和遍历(2018/10/23)
    知识点回顾及委托(2018/10/22)
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/10014935.html
Copyright © 2020-2023  润新知