• 关于tornado中session的总结


    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_

    import tornado.web
    import tornado.ioloop

    container = {}


    # container是一个储存在服务端包含客户端相关信息的字典,以键值对的形式存在

    class Session:
    def __init__(self, handler):
    self.handler = handler
    # Session(self),self为Indexhandler实例化之后的对象
    self.random_str = None

    def __genarate_random_str(self):
    # 生成随机字符串,由于生成随机字符串的代码都是一样的,所以可以抽象出来单独作为一个函数
    # 需要生成随机字符串的时候调用这个函数就返回一个经过加密的随机字符串
    import hashlib
    import time
    obj = hashlib.md5()
    obj.update(bytes(str(time.time()), encoding='utf-8'))
    random_str = obj.hexdigest()
    return random_str

    def __setitem__(self, key, value):
    # 当类的对象 obj["random_str"]="key-value的值" 自动执行这个函数
    # 总的来说,服务端先检测客户端有没有随机字符串,这里随机字符串是cookie的值
    # 而随机字符串的value对应的是session的key
    # 如果客户端没有随机字符串,则生成一个新的随机字符串
    # 如果客户端有随机字符串,
    # 检查该随机字符串服务端的session有没有,有先不做操作
    # 如果服务端没有这个随机字符串,则执行__genarate_random_str()生成新的随机字符串
    # 并把该随机字符串作为session的key值

    # 当然前提条件是你已经通过身份验证才会有以上的操作

    if not self.random_str:
    # 首先客户端发请求过来并要设置session里面的key-value值的时候触发__setitem__
    # 一开始self.random_str为None,
    # 服务端先检测客户端有没有名为'__session__'的键值对(cookie)

    random_str = self.handler.get_cookie('__session__')
    # 如果此时random_str为None,即客户端没有名为'__session__'的cookie
    # 执行__genarate_random_str()生成随机字符串
    # 并把该随机字符串作为session的key值
    if not random_str:
    random_str = self.__genarate_random_str()
    container[random_str] = {}
    # 然后此处按理来说应该为客户端设置key为'__session__',value为随机字符串的cookie
    else:
    # 如果此时客户端有名为'__session__'的cookie,
    # 那么我们就要检测这个随机字符串是否存在于session里面
    if random_str in container.keys():
    pass
    else:
    # 如果不存在,就重新创造一个新的字符串并加入到session里
    random_str = self.__genarate_random_str()
    container[random_str] = {}
    self.random_str = random_str

    container[self.random_str][key] = value
    self.handler.set_cookie("__session__", self.random_str)

    def __getitem__(self, key):
    # 当客户端请求manage页面,需要通过session验证
    # 如果服务端拿到类随机字符串,则服务端把该字符串所对应的相关信息发送给浏览器端
    random_str = self.handler.get_cookie("__session__")

    if not random_str:
    return None
    user_info_dict = container.get(random_str, None)
    if not user_info_dict:
    return None
    value = user_info_dict.get(key, None)
    return value


    class BaseHandler(tornado.web.RequestHandler):
    def initialize(self):
    self.session = Session(self)

    # 只要实例初始化都会执行这个函数
    # self.session为session这个类的对象,通过self.session可以访问session这个类的属性和方法

    class IndexHandler(BaseHandler):
    def get(self):
    if self.get_argument("u", None) in ["alex", "eric"]:
    # 判断用户密码是否正确,只有用户密码正确了才能够设置session
    self.session["is_login"] = True
    # 自动触发__setitem__,在__setitem__里面直接完成随机字符串的检验,
    # 生成,cookie的生成,session的设置
    self.session["name"] = self.get_argument("u", None)
    print(container)
    self.write("cookie设置成功了")
    else:
    self.write("请登录")


    class ManaggerHandler(BaseHandler):
    def get(self, *args, **kwargs):
    print(container)
    # print(self.get_cookie("__session__"))
    val = self.session["is_login"]
    # 自动触发__getitem__
    if val:
    self.write(self.session["name"] + "登录成功")
    else:
    self.write("登录失败")


    # 图片验证码

    class CheckCodeHandler(BaseHandler):
    def get(self, *args, **kwargs):
    # 生成 图片并且返回
    import io
    import check_code
    mstream = io.BytesIO()
    img, code = check_code.create_validate_code()

    # 将图片对象写入mstream,
    img.save(mstream, "GIF")
    # 为每个用户保存期验证码
    self.session["CheckCode"] = code

    self.write(mstream.getvalue())


    class LoginHandler(BaseHandler):
    def get(self, *args, **kwargs):
    self.render('login.html', status="")

    def post(self, *args, **kwargs):
    user = self.get_argument('user', None)
    pwd = self.get_argument('pwd', None)
    code = self.get_argument('code', None)

    check_code = self.session["CheckCode"]
    if code.upper() == check_code.upper():
    self.write('验证码正确')
    else:
    # self.redirect('/login')
    self.render('login.html', status='验证码错误')


    # csrf

    class CsrfHandler(BaseHandler):
    def get(self, *args, **kwargs):
    self.render('csrf.html')

    def post(self, *args, **kwargs):
    self.write('csrf.post')


    settings = {
    "template_path": "views",
    "static_path": "Statics",
    "static_url_prefix": "/Statics/",
    "cookie_secret": "abcdef",
    'xsrf_cookies': True

    }

    application = tornado.web.Application([
    (r"/index", IndexHandler),
    (r"/manager", ManaggerHandler),
    (r"/login", LoginHandler),
    (r"/check_code", CheckCodeHandler),
    (r"/csrf", CsrfHandler),

    ], **settings)

    if __name__ == '__main__':
    application.listen(9000)
    tornado.ioloop.IOLoop.instance().start()
  • 相关阅读:
    【个人实战】作品展播BI大屏【部分见github主页】
    JAVA设计模式之单例(singleton)
    你所不知道的redis安装方法,穿一手鞋,看一手资料
    zookeeper实现分布式锁总结,看这一篇足矣(设计模式应用实战)
    JAVA设计模式之状态模式(state)
    JAVA设计模式之适配器模式(adapter)
    JAVA设计模式之构建器模式(builder)
    Redis实现分布式锁(设计模式应用实战)
    JAVA设计模式之享元模式(flyweight)
    JAVA设计模式之组合模式(composite)
  • 原文地址:https://www.cnblogs.com/liangweixiong/p/6418052.html
Copyright © 2020-2023  润新知