Redis & Python/Django 简单用户登陆
一.Redis key相关操作:
1.del key [key..]
删除一个或多个key,如果不存在则忽略
2.keys pattern
keys模式匹配,符合glob风格通配符,glob风格的通配符规则:
? 匹配一个字符
- 匹配任意个包括0个字符
[]匹配任一个字符,可以使用-表示一个范围
\x 匹配x,用于转义字符
如:keys * 查看所有key, keys *o* 查看包含o字符的key
KYES命令需要遍历redis中所有键,当键数量较多时会影响性能,因此不建议在生产中使用
3.exists key
检查key是否存在该DB中,存在返回1否则0
4.rename key newkey
rename更名,如果key与newkey相同或者key不存在则发生错误
5.type key
检查key类型,返回值有:none(不存在), string(字符串), list(数组), set(集合), zset(有序集合), hash(哈希)
其他
1.randomkey 数据库中随机返回一个key,若数据库为空则返回nil
2.TTL key 返回给定key的剩余生存时间(time to live),秒为单位,如果没有设置则返回-1
3.expire key seconds 设置key过期时间.
4.PERSIST key 移除给定key的过期时间
5.move key db 将key 移动到另一个数据库中,如果另一个db存在该同名key或者原db没有对应的key则move无任何效果.
二.Redis key 设计
Redis键值设计并没有一致性要求,对于复杂的key,一般使用冒号做分割符.较好的实践是:对象类型:对象ID:对象属性, 如:user:1:sex 处理成set user:1:sex 男 表示表user中id为1的用户性别设置男性.
对于多个单词推荐使用.分割.
对于上述key 的设计,在编程语言中如Python也很好处理:
>>> s = "user:1:sex"
>>> s.split(':')[2:]
['sex']
三.User表设计实现
一般一张User表包含以下字段: id,username,sex,is_active,is_admin,avatar,login_count,last_login_date 等.这里选择Redis实现并用Django完成登陆注册功能.
对于user表Redis Key的设计,我们有两种方案:
(1).user:1:username的形式
(2).user:1 username value hash类型的设计
能够使用hash尽量使用,它比String的效率会高很多!
这里选择hash类型在命令行下设置如下:
127.0.0.1:6379> hmset user:1 username BeginMan pwd root sex 1 is_active 1 is_admin 1 avatar http://beginman.sinaapp.com/site_media/img/my.jpg login_count 0
OK
127.0.0.1:6379> hgetall user:1
1) "username"
2) "BeginMan"
3)"pwd"
4)"root"
5) "sex"
6) "1"
7) "is_active"
8) "1"
9) "is_admin"
10) "1"
11) "avatar"
12) "http://beginman.sinaapp.com/site_media/img/my.jpg"
13) "login_count"
14) "0"
这里先设置了一个管理员用户,那么在django中相当于执行manage.py createsuperuser. 这里还有个字段last_login_date没有写入,KV(key-value)数据库不像关系型数据库那样必须保持一致性,在后期只要用户登陆过那么就设置该字段,同时login_count累加.
然后再定义一个表用来记录用户名对应的ID,如下:
127.0.0.1:6379> set "us:BeginMan:id" 1
OK
Django完成该登陆的流程:
(1).检查该用户是否存在Redis中
(2).匹配Redis,us,pwd,若匹配成功则跳转成功页面
登陆表单类:
class LoginForm(forms.Form):
us = forms.CharField(label=u'用户名',max_length=100,widget=forms.TextInput(
attrs={'class': 'form-control', 'placeholder': u'用户名', 'required': '', 'autofocus': ''}
),
)
pwd = forms.CharField(label=u'密码',widget=forms.PasswordInput(
attrs={'class': 'form-control', 'placeholder': u'密码', 'required': ''}
)
)
view方法:
# coding=utf-8
__author__ = 'beginman'
from django.shortcuts import render
from django.http import HttpResponseRedirect
from form import LoginForm
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()) # 添加最近登陆
return HttpResponseRedirect('/')
context['msg'] = u'账号或密码错误'
context['form'] = form
form = LoginForm()
context['form'] = form
return render(request, 'login.html', context)

登陆后我们在Redis中看看该记录:
127.0.0.1:6379> hgetall user:1
1) "username"
2) "BeginMan"
3) "sex"
4) "1"
5) "is_active"
6) "1"
7) "is_admin"
8) "1"
9) "avatar"
10) "http://beginman.sinaapp.com/site_media/img/my.jpg"
11) "login_count"
12) "1" # 登陆次数+1
13) "pwd"
14) "root"
15) "last_login_date" # 添加了登陆时间
16) "2014-08-01 10:26:47.711227"
Redis&Django实现blog平台该项目已经放置在github.
四.参考资料
Redis & Python/Django 简单用户登陆的更多相关文章
- python django简单的登陆实现
实现方法: 1,可以先定义一个基础的页面访问路径 例如:http://127.0.0.1:8000/index/ 定义index路径 在urls urlpatterns = [ url(r'^ind ...
- python实现简单的登陆认证(含简单的文件操作)
需求: 让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后退出程序 可以支持多个用户登录 (提示,通过列表存多个账户信息) 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(本 ...
- [作业] Python入门基础--用户登陆
让用户输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定登陆 #__author:Mifen #date: 2018/11/28 import time #自定义本地用户名和密码 user_nam ...
- 自动化测试(二)如何用python写一个用户登陆功能
需求信息: 写一个判断登录的程序: 输入: username password 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 需要判断输入是否为空,什么也不输入,输入一个空格.n个 ...
- Python - Django - 简单分页的实现
models.py: from django.db import models class Book(models.Model): title = models.CharField(max_lengt ...
- python django简单操作
准备: pip3 install django==1.10.3 cmd django-admin startproject guest 创建一个guest的项目 cd guest manage. ...
- python django 简单接口测试页面
项目创建订单只能是接口创建的,之前都是用jar包放到jmeter里调用下单,给产品或者运维用不太方便,就想用django写一个带前端界面的下单web程序 项目结构 代码,比较渣 # coding=ut ...
- Python实现简单登陆验证(文件操作)
利用python编写一个简单的登陆验证 代码主要功能: 利用Python实现简单的登陆验证,代码主要有两个部分组成: 第一部分:登陆页面,作用是实现用户名和密码的输入 利用两个输入函数input()来 ...
- Django的用户认证
Django中用户登陆的实例: 逻辑流程 1.客户端发起请求,根据url规则会首先转至index函数, 2.在index函数上添加一个装饰器('@login_required',django自带).加 ...
随机推荐
- OA项目之导入
内容显示页: protected void btnIMP_Click(object sender, EventArgs e) { Response.Redire ...
- 如何正确接收 GitHub 的消息邮件
背景 我厂的开发流程通常都是基于 GitHub 的.在 GitHub 上 review 代码,也是我日常工作的重要组成部分.对我来说,在 code review 过程中最讨厌的莫过于,我在 pull ...
- Sql Server 查询第30条数据到第40条记录数
1.select top 10 * from (select top 40 * from tablename order by id desc);
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- css样式注意
CSS3 font-face定义的字体使用时有时候用引号,有时候不用,很奇怪,如 @font-face{ font-family: Roboto-Black; src: url('../package ...
- android的多渠道打包
本文出处:http://www.cnblogs.com/0616--ataozhijia/p/4203997.html 这里以友盟为例子. 项目快上线了,要做一个多渠道打包.不然每次都要在Androi ...
- React Native填坑之旅--动画
动画是提高用户体验不可缺少的一个元素.恰如其分的动画可以让用户更明确的感知当前的操作是什么. 无疑在使用React Native开发应用的时候也需要动画.这就需要知道RN都给我们提供了那些动画,和每个 ...
- 第35讲:List的map、flatMap、foreach、filter操作代码实战
List类的高阶方法 val fmap = List( 1,2 ,3). map { _ + 1 } //List(2, 3, 4) val fruit_rev2 = frui ...
- poj 3635/hdu 1676 Full Tank? 车辆加油+最短路
http://acm.hdu.edu.cn/showproblem.php?pid=1676 给出一张图,n<=1000,m<=10000. 有一辆车想从图的一个地方到达另外一个地方,每个 ...
- 使用NHibernate(8)-- 延迟加载
1,延迟加载. 延迟加载,即用到的时候再加载数据.这种机制是非常有情怀的,比如一篇中的用户实体有标签.问题等导航属性,如果只是用到用户名去查询整个实体,则把相关的标签和问题也都加载,性能会比较低.而有 ...