[Django系列]16.Django的更换验证码,sessionid期限和存储管理

1.点击刷新验证码

前台可以通过点击图片,更新验证码,更新验证码的过程实际上是重新发起一个get请求验证码地址路由.

前台代码
<div class="input-group">
                <input type="text" class="form-control" required placeholder="验证码" name="captcha">
                <span class="input-group-addon">
                    <img src="/comm/captcha/" alt="点击刷新验证码" class="captcha-img">
                </span>
            </div>
实际上实现的逻辑是:点击验证码图片class="captcha-img"的时候,js触发了一个函数,修改了img标签的src属性,在原有的基础上,增加了?xx=随机数,浏览器识别到url发送了变化,就重新发起get图片的请求
'use strict';
​
$(function() {
    $('.captcha-img').click(function() {
        //ajax擅长处理纯文本和json对象
        //对于流媒体不擅长,比较消耗资源
        //只要img的src改变了,就会重新加载图片
        var old_src = $(this).attr('src');
        var src = old_src + '?xx=' + Math.random();//添加随机数,故意制造src发生不同改变
//      var src = old_src;  //写此句不改变src,所以图片不会重新加载,可测试。
//        console.log(src)
        $(this).attr('src',src);
    });
});
  • $(this).attr('src')是获取当前src的属性
    • $(this).attr('src','http://www.yueguangzu.net')是获取设置当前src的属性

2.sessionid的期限

session的有效期时间是通过request.session.set_expiry(value)进行设置的。
  • 如果value是一个int类型,那么session将在value这个时间后过期,其中value代表的是秒。
  • 如果value是一个datetime或者timedelta对象,那么这个session将在指定的时间后过期。datetime必须是使用了PickleSerializer进行序列化的。
  • 如果value等于0,那么session将在web浏览器关闭后就直接过期。
  • 如果value等于None,那么session将用settings.py中设置的全局过期字段SESSION_COOKIE_AGE,这个字段默认是14天,也就是2个礼拜。
    – 读session的时候不会修改session的有效期,修改session的时候会重新设置session的有效期,会从修改的时间,重新计时。
    -如果settings.py中设置了SESSION_EXPIRE_AT_BROWSER_CLOSE=True,那么默认讲不再使用SESSION_COOKIE_AGE了,而是浏览器一关闭,session数据就会过期。这个值默认是为False

在上述例子中,如果选中记住我,那么激活request.session.set_expiry(None),这个set_expiry的参数就是有效期,如果None,说明是保存14天,如果为0,则是关闭浏览器session就立即失效.
# 登录函数
def cms_login(request):
    if request.method == 'GET':
        return render(request,'cms_login.html')
    else:
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username',None)
            password = form.cleaned_data.get('password',None)
            remember = form.cleaned_data.get('remember',None)
            print 'username=',username
            print 'password=',password
            # 1. 先用authenticate进行验证
            user = authenticate(username=username,password=password)
            if user:
                # 2. 需要登录,
                # 3. 我们的login视图函数不要和login重名
                login(request,user)
​
                if remember:
                    #选择复选框记住
                    request.session.set_expiry(None)    #空对象类型
                else:
                    #不选择记住
                    request.session.set_expiry(0)   #0是int类型对象nexturl = request.GET.get('next')
                if nexturl:
                    return redirect(nexturl)
                else:
                    return redirect(reverse('cms_index'))
            else:
                return render(request,'cms_login.html',{'error':u'用户名或密码错误!'})
        else:
            return render(request, 'cms_login.html', {'error': form.get_error()})

3.session的保存

session可以保存在文件数据库缓存以及cookie中,要设置session的保存路径,需要在settings.py中设置SESSION_ENGINE
  • session保存的位置

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = 'api'
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
  • 基于缓存的:django.contrib.sessions.backends.cache,如果设置缓存的,那么session中的所有数据将存储在内存中。同时,需要在settings.py中配置CACHES,一般我们使用memcached作为缓存,通过以下代码进行配置:
django.contrib.sessions.backends.cache
CACHES = { 
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': [
            '127.0.0.1:11211',#填写memcached的地址
        ]
    }   
}
  • 基于文件存储的:django.contrib.sessions.backends.file,那么需要配置SESSION_FILE_PATH来控制缓存的文件路径。
  • 基于cookie的:django.contrib.sessions.backends.signed_cookies,那么所有的session数据都会被保存在cookie中。
  • 基于数据库的:如果不配置SESSION_ENGINE,那么默认就是使用数据库来作为存储,如果需要显示配置,那么配置项是django.contrib.sessions.backends.db
django.contrib.sessions.backends.db
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
  • 基于数据库+缓存的:django.contrib.sessions.backends.cached_db,这种情况,每次往缓存中写数据的时候,都会同步到数据库中,来做一个持久化。每次读session数据的时候,都优先从缓存中查找,如果缓存中没有这个值了,才从数据库中查找。

4.如何清除sessions数据

session默认只会过期,为了考虑到数据的需要,django并不会从数据库或者文件中删除,所以这个要运维人员或者后台管理人员手动的清除那些已经过期了的session,最快捷的方式是通过命令定时的删除:
python manage.py clearsessions

当然,如果backend是存储在cookie或者缓存中,那么他们将在过期后自动删除。

总结

更新验证码有很多种方法,最常见的方式是通过点击图片触发jQuery修改图片的属性,达到重新get验证码图片目的;session的期限是比较重要的内容,通过修改request.session.set_expiry()的参数实现;session的保存可以存放在文件,缓存,数据库,通过修改django的backends参数进行配置.
赞(0)
未经允许不得转载:http://www.yueguangzu.net逗逗网 » [Django系列]16.Django的更换验证码,sessionid期限和存储管理
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址