设为首页 收藏本站
查看: 1623|回复: 0

[经验分享] Redis & Python/Django 简单用户登陆

[复制链接]

尚未签到

发表于 2015-4-26 11:54:46 | 显示全部楼层 |阅读模式
一.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表包含以下字段:>  对于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)
  

DSC0000.png
  登陆后我们在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.

四.参考资料
  1.Redis 键

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60867-1-1.html 上篇帖子: ganglia python插件标准 下篇帖子: python开发_python中字符串string操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表