Django框架中Cookie和Session结合使用 网站验证用户信息

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Django框架中Cookie和Session结合使用 网站验证用户信息

我们呢知道cookie非常对于用户登录来说,非常的重要,那么仅仅使用cookie还是不够的,相信你在测试的时候就会发现很多的BUG,cookie用户可以是直接使用js代码修改,所有的cookie都被我们看到,看到之后我们可以伪造cookie去实现登录,就像我们爬虫一样。所以说我们的cookie不能够存在敏感信息,包括用户的密码,资金等等了,如果这些东西被用户看到了,就可以直接修改了。

基于Cookie做用户验证的时候,不要把敏感的信息放在里面。优点:cookie是存储在浏览器端的键值对,减小了服务器端的压力负载。

引入今天要讲的Session,它是保存在服务器端的键值对。一般来说在实际的工作中需要把session和cookie结合起来使用,在前面我们创建了一个login.html用来让用户登录,index.html展现用户成功后的页面,这里可能你都会发现,不登录也可以访问index.html,为了避免这种情况,就需要将两者结合使用才能达到效果。

Session在服务器端的存在形式也是一个键值对,一般来说,session会对每个用户生成一个随机的字符串作为key用户的信息作为值,值可以为字典,因为用户的信息可能包含很多内容。如果用户再次登录的时候,就可以使用session保存的用户信息做一些核对,如果存在就登录成功,反之失败。大致session的存在形式为:

session{
    adnsiaji:{'username':'root'},
    zndiadano:{
    'is_login':True,
    'username':'root2',
    }
}

这里不再介绍需要配置什么,应该都可以熟练的实用django了,我们需要一个登录页面和登录成功之后显示的页面,登录失败显示的页面,这里自己创建。我们主要看一下views.py视图中login函数是如何设置的:

需要注意先创建数据库,不然就会报错,因为我们呢的session是存储在数据库中的,没有数据库存毛线呐。

python manage.py makemigrations
python manage.py migrate

可以不创建数据库表,运行命令就可以,现在我们运行django程序,然后登录测试,在浏览器中查看一下用户的信息,或者你可以使用Navicat来查看一下数据库中的信息。在浏览器中可以看到:name:sessionid,value:随机字符串,在数据库的django_session会出现session_key(随机字符串)、session_data(数据加密)、expire_date(日期)三列数据

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    if request.method=='POST':
        u=request.POST.get('user')
        p=request.POST.get('pwd')
        if not u:
            return render(request,'login.html')
        if u=='root' and p=='123':
            #生成随机字符串
            #写到用户浏览器
            #保存到session中
            #在随机字符串对应的用户信息中添加内容
            request.session['username']=u
            request.session['is_login']=True  #用户信息添加一个标识,用于判断是否登录成功
            return redirect('/index/')
        else:
            return render(request,'login.html')

def index(request):
    #当前用户的随机字符串
    #根据随机字符串对应的用户信息
    #用户信息包含is_login
    if request.session['is_login']:
        return render(request,'index.html',{'username':request.session['username']})
    else:
        return HttpResponse('滚')

这样就做了一个简单的判断,需要注意的是,这只是index和login函数,其它的地方需要修改,我也没有导入模块,需要自己添加上。代码运行后,如果直接访问index页面是会保存,因为在session中是不存在用户信息的,使用request.session[‘is_login’]获取不存在的信息就会报错,我们来看一下具体的和session有关的参数和解释:

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
1. 使用

def index(request):
    # 获取、设置、删除Session中数据
    request.session['k1']  #获取k1,不存在报错
    request.session.get('k1',None) #获取k1,不存在返回None
    request.session['k1'] = 123  #设置k1,不管是否存在
    request.session.setdefault('k1',123) #设置k1, 存在则不设置
    del request.session['k1']  #删掉k1的值

    # 所有 键、值、键值对,就是用户信息的字典,等同于字典的操作
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()


    # 获取当前用户session的随机字符串
    request.session.session_key

    # 将所有Session失效日期小于当前日期的数据删除
    # 已登录用户,刷新浏览器缓存,那么重新登录
    # 就会重新生成用户信息,在数据库中就会存在两条相同用户的信息
    # 只是expire_date(日期),不同
    # 则会删除小于当前日期的呢列数据
    request.session.clear_expired()

    # 检查 用户session的随机字符串 在数据库中是否存在
    request.session.exists("session_key")

    # 删除当前用户的所有Session数据,清空用户所有信息
    request.session.delete("session_key")
    request.session.clear() #同上,用于用户注销

    #设置cookie的失效时间
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。

cookie默认情况下,失效时间是两周,我们可以修改这个时间通过request.session.set_expiry(value)方法,使用也非常简单。如果不修改cookie是有默认配置的,我们来看一下具体settings.py的内容:

1. 配置 settings.py
 
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
 
SESSION_COOKIE_NAME = "sessionid"            # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                    # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None                  # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False                 # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True                # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600                  # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False       # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False            # 是否每次请求都保存Session,默认修改之后才保存(默认)

以上就是cookie的默认配置,如果不设置就会按照上面的配置进行。其中SESSION_SAVE_EVERY_REQUEST比较有用,默认情况下如果设置cookie的超时时间(10s)的话,则会从第一次操作开始记录,我们重复的在浏览器访问刷新页面,那么就会在对应的时间内过期,如果在settings.py中配置SESSION_SAVE_EVERY_REQUEST = True的话,就是每次操作过10秒,也就是说重复刷新访问页面cookie都不会生效,如果在当前页面停留10s就会失效,这种方式更加的合理一点。

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Django框架中Cookie和Session结合使用 网站验证用户信息》 发布于2020-04-25

分享到:
赞(1) 赏杯咖啡

评论 抢沙发

6 + 9 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册