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自带).加 ...
随机推荐
- nginx 的基础配置[转]
nginx 的基础配置 分类: 工具软件2013-11-13 23:26 11人阅读 评论(0) 收藏 举报 目录(?)[-] 管理配置文件 全局配置 虚拟机server配置 location配置 ...
- Android之ImageView 设置宽高
方案一: 设置布局参数 imageView.setLayoutParams(new LinearLayout.LayoutParams(newWidth, newWidth));
- 地址标记,SpringMVC转发与调用相关知识存档
1.mytest_mavenprj1中,index的 <a href="login/login.html">点击登录</a> 与 <a href=&q ...
- 学习python之练习(二)
#2.已知a1=1,a2=2,an=a(n-1)+a(n-2)(n>=3),求数列{a1,a2,a3....an}的总和 import math arr = [0]*100 num = 0 fo ...
- freeCodeCamp:Return Largest Numbers in Arrays
右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组. 提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素. /*思路 for循 ...
- 与jquery serializeArray()一起使用的函数,主要来方便提交表单
<script> $(function() { $("#butsubmit").click(function() { var data = convertArray($ ...
- iOS获取通讯录 电话号码与姓名
// 还是导入 #import <AddressBook/AddressBook.h> - (void)fetchAddressBookBeforeIOS9{ ABAddressBookR ...
- 反射中通过class标记来获取字段及方法
//这是通过class标记获取字段的代码 Field[] fields= classzz.getDeclaredFields(); //获取该class标记的表名代码,必须为,getSimpleNam ...
- UE简单操作
一:UE恢复默认配置 1.开始--运行-- “%APPDATA%” 回车 . 2. 找到并打开 IDMComp 文件夹.将文件夹“UltraEdit”整个给删除. 3.重 ...
- 基本套接字编程(1) -- tcp篇
1. Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机 ...