Tornado Cookie 登录认证 异步

  • Cookie
    # 向cookie中存储数据
    self.set_cookie("info", "msg")
    #取cookie中的数据
    info_ = self.get_cookie("info")

    # 但上面简单的cookies直接显示数据,容易被他人利用,使用加密的cookie
    # 向cookie中存储数据
    self.set_secure_cookie("info", "msg")
    info_ = self.get_secure_cookie("info")
    # 添加混淆码,加密cookie
    app = Application(
        [......],
        #混淆码一般用 base64.b64encode 格式的随机码
        cookie_secret='yYsdHBeySj2XPhzewQYsycmLHRwXsko9lz4c3sEGLMnJix0cF7JKPZc+HN7BBizJ'
    )
    # 清除cookie
    clear_cookie()
  • cookie有时间设置,通过self.cookie(name, value, expires_days)来给添加一个cookie数据,如果不设置过期时间expries_days,该cookie就是一个会话级别的临时cookie,一旦会话超时或者浏览器完全关闭的情况下,cookie中存储的数据就会丢失;如果设置了过期时间expires_days该cookie就是一个永久cookie,永久的cookie默认为30天时限。永久时间设置:为None时,关闭会话立即失效, 小于等于0时cookie没作用,创建后立即过期.
  • 附加
    # 转码encode
    # 解码decode
    # 禁止跨域请求,APP添加设置
    xsrf_cookies=True, 
    # 前端网页请求时添加令牌
    {% module xsrf_form_html() %}

登录认证

    #导入登录认证模块
    from tornado.web import  authenticated
    # 在函数处理中添加 get_current_user()函数,判断current_user当前用户是否登录的认证。
    # 重写get_current_user()函数~指定在什么情况下用户是登录状态!
    def get_current_user(self):
        name = self.get_secure_cookie("login")
        if name is not None:
            return True
        return False

    # authenticated装饰器~用于判断用户是否具有登录状态
    @authenticated
    def get(self):
        # 获取cookie中的数据
        name = self.get_secure_cookie("login")
        self.render("index.html", name=name)

    if __name__ == "__main__":
        app = Application(
            [......],   
            # 设置错误信息显示是否详细
            debug=True,
            # 这是登录认证判断没有登录(cookie ‘login’ 没有用户)时跳转的路由
            # 当完成登录时会自动返回当时请求的页面。有记忆功能。
            login_url='/login',
    )

异步

  • 前端异步
    • 通过前端Ajax实现异步处理,和其他服务器项目进行数据通信
      如天气预报接口: (http://wthrcdn.etouch.cn/weather_mini?city=)
      通过前端页面提交城市到天气预报服务器查询,返回数据到前端页面,自己服务器不参与。
    • 注意:有时数据返回的是字符串,要转化为json格式供自己使用
      // 获取天气数据,转换数据~string->json
      var _weather = JSON.parse(data).data;
    
      // DOM操作渲染数据
      var $today1 = $("<p>").text("日期:" + _weather.forecast[0].date);
    
  • 后端同步
    • 前端请求时通过自己的服务器向他人的服务器获取数据,再返还给前端.
      # 引入需要的模块
      from tornado.httpclient import HTTPClient
    
      # 定义一个天气预报处理类
      class WeatherHandler(RequestHandler):
           # 同步方式~从其他服务器获取数据
           def get(self):
           # 前端接收的数据
           city = self.get_argument("city")
           # 创建一个客户端对象
           client = HTTPClient()
           # 抓取指定的url地址中的数据,得到一个响应对象response
           # 抓取到的数据是存放在body属性中
           response = client.fetch("http://wthrcdn.etouch.cn/weather_mini?city=" + city)
           self.write(response.body)
    
  • 后端异步
    • 过程类似同步,但是方法不一样.
      # 异步操作对象 模块
      from tornado.httpclient import AsyncHTTPClient 
    
      # 定义异步操作天气预报的视图处理类
      class WeatherHandler(RequestHandler):
      # 通过注解装饰器,告诉tornado这个get处理方法是异步的~不需要自动返回数据
      @asynchronous
      def get(self):
          # 获取参数数据
          city = self.get_argument("city")
          # 创建一个异步操作对象
          client = AsyncHTTPClient()
          # 异步对象抓取数据
          client.fetch("http://wthrcdn.etouch.cn/weather_mini?city=" + city, 
                                  callback=self.deal_response)
    
       # 这个函数就是异步对象的回调函数,当异步数据获取完成时调用执行的函数
       def deal_response(self, response):
           content = response.body
           # 将数据返回给前端页面
           self.write(content)
           # 通过finish()函数告诉tornado异步操作结束,手工控制返回数据
           self.finish()
    
  • 附加
    • 后端同步与异步的区别:通过siege压力测试工具压力测试,可以看出同步与异步的差距。
    • 当并发量与访问时间相同时,异步的处理效率远高于同步的方式。

长连接(聊天室,网页客服)

  • 前端页面
<script>
        // 创建一个js中的 websocket 对象,保持和服务器之间的通信
        // var _websocket = new WebSocket("websocket连接字符串,使用websocket协议连接")
        var _websocket = new WebSocket("ws://192.168.11.102:8000/chat");
        // 随时等待接收服务器的消息:保持一个长连接,一旦服务器有消息的话,需要实时接收。
        _websocket.onmessage = function(e) {
              // 接受服务器发送的数据 e 一般默认为 e
              var _content = e.data; 
        };
        $("#send").click(function() {
              // 当点击按钮的时候,需要给服务器发送数据
              var $msg = $("#msg").val();
              _websocket.send($msg)
        })
        // 处理让消息窗口的滚动条显示在最底下的位置
        $("#history").scrollTop($("#history")[0].scrollHeight)
   </script>
  • 后端服务器
    # 导入后端服务器长连接模块
    from tornado.websocket import WebSocketHandler

    # 定义聊天消息长连接处理类
    # 和客户端保持长连接的视图处理类需要重写父类的方法完成和客户端的通信
    class ChatHandler(WebSocketHandler):
          # 定义一个保存所有用户的集合 set()
          online_users = set()

          # 1.重写open()函数,保存接入的用户数据
          def open(self):
               # 新的客户端连接的时候,open()函数自动执行,
               # 将接入的数据保存到集合中 add(self)
               self.online_users.add(self)
               # 向所有人发送消息,用户谁连接上了
               for user in self.online_users:
                    # 发送数据 write_message()   获取用户IP self.request.remote_ip
                    user.write_message("[%s上线了]" % self.request.remote_ip)

          # 2.重写on_message()函数,获取客户端发送的消息并转发给所有用户
          def on_message(self, message):
               # 函数on_message会自动接收客户端发送的数据,数据包含在message变量中
               # 向所有人发送消息,用户谁说了什么

          # 重写on_close()函数,当断开某个连接时,移除在服务器记录的数据
          def on_close(self):
               # 当一个客户端连接断开时自动执行的函数on_close()
               # 移除用户数据 remove(self)
               self.online_users.remove(self)
               # 向所有人发送消息,用户谁离开了

          # 允许跨域访问,不然无法访问
          def check_origin(self, origin):
               return True
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容