cookie的本质其实就是在浏览器端保存的键值对, 每当浏览器端发送一次请求, 都会将这些键值对附加在请求中并发送给服务器端。

一、目录结构

二、main_pro.py

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import tornado.ioloop
import tornado.web class IndexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
# self.write("Hello, world")
t = self.get_cookie('auth')
if t == '':
self.render('index.html')
else:
self.redirect('/login') class LogoutHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
# self.write("Hello, world")
self.set_cookie('auth', '') #退出登录,将cookie信息清空
self.redirect('/login') class LoginHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
# self.write("Hello, world")
self.render('login.html', status_text='') def post(self, *args, **kwargs):
username = self.get_argument('username', None)
pwd = self.get_argument('password', None)
if username == 'yusheng_liang' and pwd == 'adm':
self.set_cookie('auth', '') #登录谁成功,设置cookie信息
self.redirect('/index')
else:
self.render('login.html', status_text='登录失败')
settings = {
'template_path': 'views', #视图模板路径
'static_path': 'static', #静态文件路径
} #路由映射,路由系统
def make_app():
return tornado.web.Application([
(r"/login", LoginHandler),
(r"/index", IndexHandler),
(r"/logout", LogoutHandler),
], **settings) if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()

1)self.set_cookie('name', 'test') 设置未加密的cookie, 键为'name', 值为test

2)self.set_secure_cookie('user', 'test') 设置加密cookie, 键为'user', 值为test. 设置加密cookie我们需要在配置中添加自定义的加密串(俗称对加密结果加盐)"cookie_secret": 'test-secret,'

3)name = self.get_cookie('name', None)获取指定key未加密的cookie的值

4)user = self.get_cookie('user', None) 获取指定key的加密后的cookie的值

5)对于set_cookie()set_secure_cookie()都用以下常见参数value 表示传入cookiename对应的值name 表示传入cookie的键

6)domain=None 表示域名

7)expires=None 设置过期时间, 这里单位为秒

path="/" 表示当前的cookie在那些路径下有效, /表示当前域名下所有的路径均有效

expires_days=None 设置过期时间, 单位为天

自定义一个set_secure_cookie

 import tornado.ioloop
import tornado.web class BaseHandler(tornado.web.RequestHandler): def get_current_user(self):
return self.get_secure_cookie("login_user") class MainHandler(BaseHandler): @tornado.web.authenticated
def get(self):
login_user = self.current_user
self.write(login_user) class LoginHandler(tornado.web.RequestHandler):
def get(self):
self.current_user() self.render('login.html', **{'status': ''}) def post(self, *args, **kwargs): username = self.get_argument('name')
password = self.get_argument('pwd')
if username == 'admin' and password == '':
self.set_secure_cookie('login_user', 'admin')
self.redirect('/')
else:
self.render('login.html', **{'status': '用户名或密码错误'}) settings = {
'template_path': 'template',
'static_path': 'static',
} application = tornado.web.Application([
(r"/index", MainHandler),
(r"/login", LoginHandler),
], **settings) if __name__ == "__main__":
application.listen()
tornado.ioloop.IOLoop.instance().start()

三、JavaScript操作Cookie

由于Cookie保存在浏览器端,所以在浏览器端也可以使用JavaScript来操作Cookie。

/*
设置cookie,指定秒数过期,
name表示传入的key,
value表示传入相对应的value值,
expires表示当前日期在加5秒过期
*/ function setCookie(name,value,expires){
var temp = [];
var current_date = new Date();
current_date.setSeconds(current_date.getSeconds() + );
document.cookie = name + "= "+ value +";expires=" + current_date.toUTCString();
}
 四、自定义一个session验证
 #!/usr/bin/env python
# -*- coding:utf- -*-
import tornado.web
import tornado.ioloop container = {}
class Session:
def __init__(self, handler):
self.handler = handler
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):
# 在container中加入随机字符串
# 定义专属于自己的数据
# 在客户端中写入随机字符串
# 判断,请求的用户是否已有随机字符串
if not self.random_str:
random_str = self.handler.get_cookie('__session__')
if not random_str:
random_str = self.__genarate_random_str()
container[random_str] = {}
else:
# 客户端有随机字符串
if random_str in container.keys():
pass
else:
random_str = self.__genarate_random_str()
container[random_str] = {}
self.random_str = random_str # self.random_str = asdfasdfasdfasdf container[self.random_str][key] = value
self.handler.set_cookie("__session__", self.random_str) def __getitem__(self, key):
# 获取客户端的随机字符串
# 从container中获取专属于我的数据
# 专属信息【key】
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)

web框架--tornado之cookie与session初识的更多相关文章

  1. Django框架 之 Cookie和Session初识

    Django框架 之 Cookie和Session初识 浏览目录 Cookie介绍 Django中的Cookie Session 一.Cookie介绍 1.Cookie产生的意义 众所周知,HTTP协 ...

  2. tornado 09 cookie和session

    tornado 09 cookie和session 一.cookie #有什么办法能够让浏览器记住登录信息,下次再打开的时候可以自动登录?网站是如何记录登录信息的? class SetCookieHa ...

  3. Python Web框架 tornado 异步原理

    Python Web框架 tornado 异步原理 参考:http://www.jb51.net/article/64747.htm 待整理

  4. Python web框架 Tornado异步非阻塞

    Python web框架 Tornado异步非阻塞   异步非阻塞 阻塞式:(适用于所有框架,Django,Flask,Tornado,Bottle) 一个请求到来未处理完成,后续一直等待 解决方案: ...

  5. Python web框架 Tornado(三)自定义session组件

    我们在学习Django框架的过程中,内部封装了session组件,以方便于我们使用进行验证.但是Tornado框架是没有session的,所以如果想使用session的话,就需要我们自己定制相对应的组 ...

  6. web框架--tornado框架之初识

    在python中常见的web框架构建模式有以下两种: *MVC框架: * 数据库相关操作的Models 视图文件的Views 业务逻辑的Controllers MTV框架: 数据库相关操作的Model ...

  7. 第一个web框架tornado

    简介 tornado,是我学到的第一个web框架是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google ...

  8. Python web框架 Tornado(一)基础学习

    概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...

  9. AJAX异步、sweetalert、Cookie和Session初识

    一.AJAX的异步示例 1. urls.py from django.conf.urls import url from apptest import views urlpatterns = [ ur ...

随机推荐

  1. 当usbnet打印 kevent * may have been dropped(转)

    http://patchwork.ozlabs.org/patch/815639/ Every once in a while when my system is under a bit of str ...

  2. python 利用cip.cc查询IP归属地

    def ipinfocip(ip): # 获得 输入框中的信息 url = "http://www.cip.cc/%s" % ip # 模拟浏览器请求网络 headers={'Us ...

  3. JS分类选择插件

    需要做一个选择分类工具,大致要求如下: 点击按钮,显示一级分类,指向某个一级分类显示对应二级分类,分类有几层不定. 只能选择最后一个分类,然后把分类的ID 传值给按钮的value 我的思路: 1.后台 ...

  4. LeetCode 200:岛屿数量 Number of Islands

    题目: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. Given ...

  5. vuex源码分析(二) state及strict属性 详解

    state也就是vuex里的值,也即是整个vuex的状态,而strict和state的设置有关,如果设置strict为true,那么不能直接修改state里的值,只能通过mutation来设置 例1: ...

  6. 你真的了解nginx重定向URI?-rewrite和alias指令

    未经允许不得转载!最近发现有博主转载我的文章,并没有跟我打招呼,也没有注明出处!!!! 熟悉Nginx的同学都知道Nginx可以用来做负载均衡和反向代理,非常好用.做前后端分离也是非常的方便. 今天我 ...

  7. java函数式编程的形式

    java中没有真正的函数变量: 一.所有的函数(拉姆达)表达式,都被解释为functional interface @FunctionalInterface interface GreetingSer ...

  8. Ext.NET-WebForm之TreePanel组件

    开启VS2017创建WebForm项目 打开NuGet搜索Ext.NET并安装 安装后可见 还自动帮我们创建了一个页面和文件夹项 打开自动添加的页面Ext.NET.Default.aspx,运行项目出 ...

  9. 小鸟初学Shell编程(三)脚本不同执行方式的影响

    执行命令的方式 执行Shell脚本的方式通常有以下四种 方式一:bash ./test.sh 方式二:./test.sh 方式三:source ./test.sh 方式四:. ./test.sh 执行 ...

  10. JavaScript addEventListener()事件监听方法

    addEventListener()方法将事件处理程序附加到指定的元素. addEventListener()方法将事件处理程序附加到元素,而不覆盖现有的事件处理程序. 您可以向一个元素添加许多事件处 ...