Tornado Cookies 登录认证 异步

1.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() %}

2.登录认证

    #导入登录认证模块
    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',
    )

3.异步

  • 前端异步
    通过前端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压力测试工具压力测试,可以看出同步与异步的差距。
当并发量与访问时间相同时,异步的处理效率远高于同步的方式。

4.长连接

一般实现聊天室,网页客服等

  • 前端页面
       <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
    

猜你喜欢

转载自blog.csdn.net/weixin_33933118/article/details/87226910