Tornado 没有session,只有cookie_secret,这在一些情况下是不利于开发的。所有我们可以给Tornado加上session的功能。

这篇文章讲解的是依靠第三方包来实现。以后的文章我们还可以自己写一套。

以下为步骤:

1,安装包pycket

  1. $ pip install pycket

2,使用时引入包

  1. from pycket.session import SessionMixin

3,通过Handler传入(还可以创建一个BaseHandler,将其封装到BaseHandler也可以。这里为了简单,就不封装了)

4,在配置文件中进行配置

  1. '''
  2. Redis 配置
  3. '''
  4. # settings = {
  5. # # cookie_secret必须设置
  6. # 'cookie_secret': "2379874hsdhf0234990sdhsaiuofyasop977djdj",
  7. # 'xsrf_cookies': True,
  8. # 'debug': False,
  9. # # 1 配置pycket 注意别忘记开启redis服务
  10. # 'pycket': {
  11. # 'engine': 'redis',
  12. # 'storage': {
  13. # 'host': 'localhost',
  14. # 'port': 6379,
  15. # 'db_sessions': 10,
  16. # 'db_notifications': 11,
  17. # 'max_connections': 2 ** 31,
  18. # },
  19. # 'cookies': {
  20. # # 设置过期时间
  21. # 'expires_days': 2,
  22. # #'expires':None, #秒
  23. # },
  24. # }
  25. # }
  26. '''
  27. Memcached 配置
  28. '''
  29. settings = {
  30. 'cookie_secret': "2379874hsdhf0234990sdhsaiuofyasop977djdj",
  31. 'pycket': {
  32. 'engine': 'memcached',
  33. 'storage': {
  34. 'servers': ('localhost:11211',)
  35. },
  36. 'cookies': {
  37. 'expires_days': 120,
  38. },
  39. },
  40. }

5,使用

  1. def get(self):
  2. # 两种设置方式
  3. self.session.set('foo', ['bar', 'baz'])
  4. self.session['test'] = 'test!'
  5.  
  6. # 两种获取方式
  7. print self.session['test']
  8. print self.session.get('foo')

完整代码:

  1. #--*--coding:utf-8--*--
  2.  
  3. import tornado.web
  4. import tornado.httpserver
  5. import tornado.ioloop
  6. import tornado.options
  7. import os.path
  8. from pycket.session import SessionMixin
  9. from tornado.options import define, options
  10. define("port", default=8001, help="run on the given port", type=int)
  11.  
  12. class Application(tornado.web.Application):
  13. def __init__(self):
  14. handlers = [
  15. (r"/", MainHandler),
  16. ]
  17. '''
  18. Redis 配置
  19. '''
  20. # settings = {
  21. # # cookie_secret必须设置
  22. # 'cookie_secret': "2379874hsdhf0234990sdhsaiuofyasop977djdj",
  23. # 'xsrf_cookies': True,
  24. # 'debug': False,
  25. # # 1 配置pycket 注意别忘记开启redis服务
  26. # 'pycket': {
  27. # 'engine': 'redis',
  28. # 'storage': {
  29. # 'host': 'localhost',
  30. # 'port': 6379,
  31. # 'db_sessions': 10,
  32. # 'db_notifications': 11,
  33. # 'max_connections': 2 ** 31,
  34. # },
  35. # 'cookies': {
  36. # # 设置过期时间
  37. # 'expires_days': 2,
  38. # #'expires':None, #秒
  39. # },
  40. # }
  41. # }
  42. '''
  43. Memcached 配置
  44. '''
  45. settings = {
  46. 'cookie_secret': "2379874hsdhf0234990sdhsaiuofyasop977djdj",
  47. 'pycket': {
  48. 'engine': 'memcached',
  49. 'storage': {
  50. 'servers': ('localhost:11211',)
  51. },
  52. 'cookies': {
  53. 'expires_days': 120,
  54. },
  55. },
  56. }
  57. tornado.web.Application.__init__(self, handlers, **settings)
  58.  
  59. class MainHandler(tornado.web.RequestHandler, SessionMixin):
  60. def get(self):
  61. # 两种设置方式
  62. self.session.set('foo', ['bar', 'baz'])
  63. self.session['test'] = 'test!'
  64.  
  65. # 两种获取方式
  66. print self.session['test']
  67. print self.session.get('foo')
  68.  
  69. if __name__ == "__main__":
  70. tornado.options.parse_command_line()
  71. http_server = tornado.httpserver.HTTPServer(Application())
  72. http_server.listen(options.port)
  73. tornado.ioloop.IOLoop.instance().start()

注意:若使用Redis,确保你的Redis已经启动。若使用 Memcached ,请确保Memcached 已经启动

为Tornado框架加上基于Redis或Memcached的session 【第三方】的更多相关文章

  1. 基于redis实现tomcat的session会话保持 (转)

    出处:https://cloud.tencent.com/developer/article/1402997 基于redis实现tomcat的session会话保持 在实际生产中,我们经常部署应用服务 ...

  2. Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

    Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...

  3. 万能分布式消费框架,添加基于redis中间件的方式。

    框架目的是分布式调度起一切任何函数(当然也包括调度起一切任何方法). 之前写的是基于rabbitmq的,作为专用的消息队列好处比redis的list结构好很多.但有的人还是强烈喜欢用redis,以及r ...

  4. 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算

    Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...

  5. 第二百六十三节,Tornado框架-基于正则的动态路由映射

    Tornado框架-基于正则的动态路由映射 1.在路由映射条件里用正则匹配访问路径后缀2.给每一个正则匹配规则(?P<设置名称>)设置一个名称,3.在逻辑处理的get()方法或post() ...

  6. 基于redis的简易分布式爬虫框架

    代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...

  7. 从零到一手写基于Redis的分布式锁框架

    1.分布式锁缘由 学习编程初期,我们做的诸如教务系统.成绩管理系统大多是单机架构,单机架构在处理并发的问题上一般是依赖于JDK内置的并发编程类库,如synchronize关键字.Lock类等.随着业务 ...

  8. 基于redis的分布式锁的实现与框架解决方案

    利用切面实现redis分布式锁:https://www.cnblogs.com/xiaoxiongcanguan/p/10718202.html 细节分析redis实现分布式锁的前因后果:https: ...

  9. python运维开发(二十三)---tornado框架

    内容目录: 路由系统 模板引擎 cookie 加密cookie 自定义api 自定义session 自定义form表单验证 异步非阻塞 web聊天室实例 路由系统 路由系统其实就是 url 和 类 的 ...

随机推荐

  1. Mybatis中使用 #{} 和 ${} 向sql传参时的区别

    今天在工作时,使用MyBatis中向sql传递两个参数时,一直显示SQL语法错误,仔细检查,才发现传入的参数被加上了引号,导致传入的参数(要传入的参数是表名)附近出现语法错误. 错误写法: } a } ...

  2. 解决发http get请求的时候不成功,出现android.os.NetworkOnMainThreadException的异常

    问题描述:在接游戏sdk的时候,由于游戏要求购买的时候是在主线程里面进行的,但是发http请求是不能在主线程里面发,否则就会出现android.os.NetworkOnMainThreadExcept ...

  3. 如何将txt的多行记录直接导入到mysql数据库

    1.使用工具是navicat for mysql 2.要导入的txt格式要求,第一行为栏位,及个属性名 第二行开始为数据行 如下所示,例如要插入多行账号密码

  4. 只有第三方控件pas代码生成控件

    如果他人的VCl控件只有pas代码,如何生成控件? 步骤:1.new Pakage(bpl ) 2.在Contains中Add VCl***.pas 3.再Complie ,Install 即可 XE ...

  5. Spring Data JPA 复杂/多条件组合查询

    1: 编写DAO类或接口  dao类/接口 需继承 public interface JpaSpecificationExecutor<T> 接口: 如果需要分页,还可继承 public ...

  6. 如何在java中用Arraylist中实现冒泡排序的问题

    众所周知,冒泡排序法在一般数组中就3步, if(a<b){ temp=a; a=b; b=temp; } 然而,在集合中就不是简单的交换一下了,因为交换之后,必须保证新的值被重新设置到集合中去. ...

  7. Android使用ViewPager实现导航菜单

    首先设置页面的Fragment布局: public class TabFragment extends ListFragment { @Override public void onViewCreat ...

  8. Eclipse简单插件开发-启动时间提示

    1.新建Plug-in Project 不用改其他选项,直接点击"Next",然后点击"Finish"   2.新建ShowTime.java package ...

  9. scroll事件实现监控滚动条并分页显示示例(zepto.js )

    今天做了一个类似于手机端京东首页的页面,效果图如下: 刷新页面的时候,标题栏(也就是搜索栏),背景是透明的,当我们往下滑的时候,可以改变标题栏的背景透明度(渐变效果): 当标题栏滑过轮播图后,透明度就 ...

  10. Linux服务器学习(一)

    一.首先连接服务器 下载一个windows下连接linux的ssh工具,我这里用的putty.一次填入HostName(主机名,可以是服务器域名也可以是对应的ip).Port(端口号默认为22).Co ...