Tornado中的cookies与session的设置

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)


猜你喜欢

转载自blog.csdn.net/qq_35810838/article/details/84146942
今日推荐