1.思路

2.程序实现

1.用户系统类

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

#coding=utf-8
#Redis实现用户系统
__author__ = 'beginman'
import redis
import datetime
import hashlib
r = redis.StrictRedis(host='localhost', port='6379', db=0) class usSystem(object):
def __init__(self, request,response=None, uid=0, **kwargs):
self.request = request
self.response = response
self.kwargs = kwargs
self.uid = uid # user id
self.sessionid = None def testCookie(self):
"""事先在登陆方法中下了request.session.set_test_cookie()的套子"""
if self.request.session.test_cookie_worked():
self.request.session.delete_test_cookie()
return True
return False def getUsObj(self):
"""返回用户对象,有则说明用户已登陆,无则注销"""
self.sessionid = self.request.COOKIES.get('sessionid', None)
if r.exists(self.sessionid):
if r.exists('sessionid_%s' %self.sessionid):
return r.hget('sessionid_%s' %self.sessionid, 'uid')
return None def setCookieAndSession(self):
"""cookie在登陆成功后已经写入"""
self.sessionid = self.request.COOKIES.get('sessionid', None)
if not self.sessionid:
# set cookie
h = hashlib.md5()
h.update(datetime.datetime.now())
self.response.set_cookie('sessionid', h.hexdigest())
self.sessionid = h.hexdigest() if not r.exists('sessionid_%s' %self.sessionid):
#set session
r.hset('sessionid_%s' %self.sessionid,'uid', self.uid) return True

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

# coding=utf-8
__author__ = 'beginman'
from django.shortcuts import render
from django.http import HttpResponseRedirect
from form import LoginForm
from common.userSystem import usSystem
import redis
import datetime
r = redis.StrictRedis(host='localhost', port='6379', db=0) def home(request):
return render(request, 'index.html') def usLogin(request):
context = {}
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
us = form.cleaned_data['us']
pwd = form.cleaned_data['pwd']
if r.exists('us:%s:id' %us): # 检查是否存在该用户关系键值
uid = r.get('us:%s:id' %us) # 获取该用户在user表中对应的id
if r.exists('user:%s' %uid): # 检查是否存在该用户键值(如user:1)
us_, pwd_ = r.hmget('user:%s' %uid, 'username', 'pwd') # 获取该用户的用户名密码
if us_ == us and pwd_ == pwd: # 校验成功
r.hincrby('user:%s' %uid, 'login_count', 1) # 登陆次数累加
r.hset('user:%s' %uid, 'last_login_date', datetime.datetime.now()) # 添加最近登陆
# set Cookies
res = HttpResponseRedirect('/')
ussys = usSystem(request, res, uid)
if ussys.testCookie() and ussys.setCookieAndSession():
return res context['msg'] = u'账号或密码错误'
context['form'] = form request.session.set_test_cookie()
form = LoginForm()
context['form'] = form
return render(request, 'login.html', context)

同时要注意中间件处理:

#coding=utf-8
#中间件扩展
__author__ = 'beginman'
from django.http import HttpResponseRedirect
from django.conf import settings
from common.userSystem import usSystem class Mymiddleware(object):
def process_request(self, request):
"""Request预处理函数"""
path = str(request.path)
request.session['domain'] = settings.DOMAIN
if path.startswith('/site_media/'):
return None
#验证登陆
ussys = usSystem(request)
if ussys.getUsObj():
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. Cup fungus in Corvobado Nation Park,Costa Rica

  2. 20155201 实验五《Java面向对象程序设计》实验报告

    20155201 实验五<Java面向对象程序设计>实验报告 一.实验内容 1. 数据结构应用 2. 结对编程:利用IDEA完成网络编程任务,1人负责客户端,1人负责服务器 3. 密码结对 ...

  3. 学习Zookeeper之第2章Zookeeper安装

    第 2 章 Zookeeper安装 2.1 本地模式安装部署 2.2 配置参数解读 第 2 章 Zookeeper安装 2.1 本地模式安装部署 1)安装前准备: (1)安装 jdk (2)通过 fi ...

  4. Redis之持久化

    Redis 持久化 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的所有数据进 ...

  5. 利用ES6中的Array.find/ Array.findIndex来判断数组中已存在某个对象

    前端开发过程中,我们会经常遇到这样的情景:比如选中某个指标obj,将其加入到数组checkedArr中({id: 1234, name: 'zzz', ...}),但是在将其选中之前要校验该指标是否已 ...

  6. Mac下安装hexo Error: Cannot find module './build/Release/DTraceProviderBindings 解决

    参考: Github:Mac 下已经装了hexo,仍旧报错 官方文档 $ npm install hexo --no-optional if it doesn't work try $ npm uni ...

  7. Android -- Activity的生命周期,Activity四种启动模式 Standard, SingleTop,SingleTask,SingleInstance

    1. 示例图 . 这七个方法定义了Activity的完整生命周期.实现这些方法可以帮助我们监视其中的三个嵌套生命周期循环:  Activity的完整生命周期自第一次调用onCreate()开始,直至调 ...

  8. SQL server 2012 阻塞分析查询

    最近公司的数据库并发有点大,由于CPU不高.内存不高.硬盘正常.网络也正常等等,但系统还是会卡,所以就怀疑是数据库阻塞导致的,于是去查询资料,看书及经过用以下sql观查,经过几天对数据的分析找到原因并 ...

  9. shell 输入不显示在监视器上

    #!/bin/bash read -s -p "Enter your password:" pass echo "your password is $pass" ...

  10. 指定html转pdf文档

    1.资源 <script type="text/javascript" src="./js/canvg2.js"></script> & ...