1.思路

2.程序实现

1.用户系统类

这里模拟一个蹩脚的用户系统类(userSystem),如下:

  1. #coding=utf-8
  2. #Redis实现用户系统
  3. __author__ = 'beginman'
  4. import redis
  5. import datetime
  6. import hashlib
  7. r = redis.StrictRedis(host='localhost', port='6379', db=0)
  8. class usSystem(object):
  9. def __init__(self, request,response=None, uid=0, **kwargs):
  10. self.request = request
  11. self.response = response
  12. self.kwargs = kwargs
  13. self.uid = uid # user id
  14. self.sessionid = None
  15. def testCookie(self):
  16. """事先在登陆方法中下了request.session.set_test_cookie()的套子"""
  17. if self.request.session.test_cookie_worked():
  18. self.request.session.delete_test_cookie()
  19. return True
  20. return False
  21. def getUsObj(self):
  22. """返回用户对象,有则说明用户已登陆,无则注销"""
  23. self.sessionid = self.request.COOKIES.get('sessionid', None)
  24. if r.exists(self.sessionid):
  25. if r.exists('sessionid_%s' %self.sessionid):
  26. return r.hget('sessionid_%s' %self.sessionid, 'uid')
  27. return None
  28. def setCookieAndSession(self):
  29. """cookie在登陆成功后已经写入"""
  30. self.sessionid = self.request.COOKIES.get('sessionid', None)
  31. if not self.sessionid:
  32. # set cookie
  33. h = hashlib.md5()
  34. h.update(datetime.datetime.now())
  35. self.response.set_cookie('sessionid', h.hexdigest())
  36. self.sessionid = h.hexdigest()
  37. if not r.exists('sessionid_%s' %self.sessionid):
  38. #set session
  39. r.hset('sessionid_%s' %self.sessionid,'uid', self.uid)
  40. return True

然后在登陆方法中这样写:

  1. # coding=utf-8
  2. __author__ = 'beginman'
  3. from django.shortcuts import render
  4. from django.http import HttpResponseRedirect
  5. from form import LoginForm
  6. from common.userSystem import usSystem
  7. import redis
  8. import datetime
  9. r = redis.StrictRedis(host='localhost', port='6379', db=0)
  10. def home(request):
  11. return render(request, 'index.html')
  12. def usLogin(request):
  13. context = {}
  14. if request.method == 'POST':
  15. form = LoginForm(request.POST)
  16. if form.is_valid():
  17. us = form.cleaned_data['us']
  18. pwd = form.cleaned_data['pwd']
  19. if r.exists('us:%s:id' %us): # 检查是否存在该用户关系键值
  20. uid = r.get('us:%s:id' %us) # 获取该用户在user表中对应的id
  21. if r.exists('user:%s' %uid): # 检查是否存在该用户键值(如user:1)
  22. us_, pwd_ = r.hmget('user:%s' %uid, 'username', 'pwd') # 获取该用户的用户名密码
  23. if us_ == us and pwd_ == pwd: # 校验成功
  24. r.hincrby('user:%s' %uid, 'login_count', 1) # 登陆次数累加
  25. r.hset('user:%s' %uid, 'last_login_date', datetime.datetime.now()) # 添加最近登陆
  26. # set Cookies
  27. res = HttpResponseRedirect('/')
  28. ussys = usSystem(request, res, uid)
  29. if ussys.testCookie() and ussys.setCookieAndSession():
  30. return res
  31. context['msg'] = u'账号或密码错误'
  32. context['form'] = form
  33. request.session.set_test_cookie()
  34. form = LoginForm()
  35. context['form'] = form
  36. return render(request, 'login.html', context)

同时要注意中间件处理:

  1. #coding=utf-8
  2. #中间件扩展
  3. __author__ = 'beginman'
  4. from django.http import HttpResponseRedirect
  5. from django.conf import settings
  6. from common.userSystem import usSystem
  7. class Mymiddleware(object):
  8. def process_request(self, request):
  9. """Request预处理函数"""
  10. path = str(request.path)
  11. request.session['domain'] = settings.DOMAIN
  12. if path.startswith('/site_media/'):
  13. return None
  14. #验证登陆
  15. ussys = usSystem(request)
  16. if ussys.getUsObj():
  17. pass

在一些需要登陆后才能访问的可以写在验证登陆后面.这里还需要慢慢改进.

自定义redis session的更多相关文章

  1. MVC4+WebApi+Redis Session共享练习(上)

    这几天生病了,也没有心情写博客,北京医院真心伤不起呀,钱不少花,病没治好,还增加了新病,哎不说了,周末还得去大医院检查一下,趁女盆友还没有回来,把前几天写的东西总结一下.本文也会接触一点webApi的 ...

  2. Tornado 自定义Form,session实现方法

    一. 自定义Tornado 验证模块 我们知道,平时在登陆某个网站或软件时,网站对于你输入的内容是有要求的,并且会对你输入的错误内容有提示,对于Django这种大而全的web框架,是提供了form表单 ...

  3. Flask中的session ,自定义实现 session机制, 和 flask-session组件

    session 是基于cookie实现, 保存在服务端的键值对(形式为 {随机字符串:'xxxxxx'}), 同时在浏览器中的cookie中也对应一相同的随机字符串,用来再次请求的 时候验证: 注意 ...

  4. redis session 共享 测试案列

    下载 spring redis session demo 2.分别在不同的服务器上启动 3.nginx 安装 测试

  5. 基于django的自定义简单session功能

    基于django的自定义简单session功能 简单思路: 1.建立自定义session数据库 2.登入时将用户名和密码存入session库 3.将自定义的随机session_id写入cookie中 ...

  6. SpringBoot SpringSession redis SESSION

    号称无缝整合httpsession 共享, 但注意如果存在第三方框架,例如SESSION并发控制,这个是需要自己重写session名单的. 关于redis session 共享 的session并发控 ...

  7. nginx tomcat负载均衡 使用redis session共享

    环境准备 1.准备一台nginx服务器 ip192.168.1.133 端口81 安装过程: #首先安装依赖: yum -y install gcc-c++ yum -y install pcre p ...

  8. tomcat redis session共享

    编译redis所需要的序列化包 安装 gradle Linux & MacOS users Configure your PATH environment variable to includ ...

  9. Spring Boot自定义Redis缓存配置,保存value格式JSON字符串

    Spring Boot自定义Redis缓存,保存格式JSON字符串 部分内容转自 https://blog.csdn.net/caojidasabi/article/details/83059642 ...

随机推荐

  1. “4K云字库”基本框架图

    "4K云字库"基本框架图   谷歌的web-font,令"云字库"成为IT热点.   云字库,只是云计算的一个细小分支 ,而云计算的基础,是"大数据& ...

  2. uva11090 Bellman-Ford 运用

    给定一一个n个点m条边的加权有向图, 平均值最小的回路. 二分答案,对于每个二分的mid 做一次Bellman-Fprd , 假设有k条边组成的回路. 回路上各条边的权值为  w1 , w2 ..wk ...

  3. Python: 字符串格式化format()函数的使用

    python从2.6开始支持format,新的更加容易读懂的字符串格式化方法,从原来的% 模式变成新的可读性更强的 花括号声明{}.用于渲染前的参数引用声明, 花括号里可以用数字代表引用参数的序号, ...

  4. qq空间相册下载

    qq空间相册下载 描述 目前功能只可以下载 单个相册 程序基本是3个独立分开的部分. 解析(某一用户)所有相册 解析(单个)相册所有图片地址并写文件 根据文件下载图片 目的 只要有权限可以访问到的相册 ...

  5. ubuntu 16.04下更换源和pip源【转】

    本文转载自:https://blog.csdn.net/weixin_41500849/article/details/80246221 写在前面的话 本文主要内容是更换系统源为清华大学源,更换pyt ...

  6. Ajax请求304问题

    ajax默认是开启缓存的,所以get请求如果路径一样,会先找缓存,如果缓存存在就用缓存. 解决方案: 1.在修改url为动态变化的,如url后面加一个&timestamp=Date.parse ...

  7. 【大型web架构】一个大型web系统架构设计和技术选型的讨论摘录

    1.数据库压力问题 所有的压力最终都会反映到数据库方面,一定要对数据库有一个整体的规划. 可以按照业务.区域等等特性对数据库进行配置,可以考虑分库.使用rac.分区.分表等等策略,确保数据库能正常的进 ...

  8. mybatis报Invalid bound statement (not found) 分析

      解决问题的步骤,请参考: 1.mapper.xml要和对应的mapper接口在同一个包下,包名要一模一样. 2.Mapper接口中的方法在Mapper.xml中没有,然后执行Mapper接口的方法 ...

  9. python yaml文件读写

    import yaml yaml_dict={"} with open("a.yaml", "w") as f: yaml.safe_dump(yam ...

  10. zentaoPHP框架是做什么的(整理)

    zentaoPHP框架是做什么的(整理) 一.总结 一句话总结:应该是主要用作项目管理的(暂时没用过) 项目管理 看了下面的两篇资料,感觉没啥特色 看了文件目录结构,感觉就是一个标准的mvc框架 看了 ...