博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django的cookie和session
阅读量:7121 次
发布时间:2019-06-28

本文共 6472 字,大约阅读时间需要 21 分钟。

先来个简单的cookie吧

def foo(request):    print(request.COOKIES)    obj=redirect("/path/")    obj=HttpResponse("content")    obj=render(request,"html")    obj.set_cookie("key","value",max_age=60,path="/path/")    #这一句是重点,max_age=60单位是秒    obj.set_signed_cookie("key","value",max_age=60,path="/path/",salt="egonnb")    request.get_signed_cookie("key",salt="egonnb");    return obj

上面我们就创建了一个cookie,那么我们在另一端怎么去出来呢

其实就是一句话

  

value=request.cookie.get("key")

 

session

在和之前我们需要在为sql添加挂在

python manage.py makemigrations

 

python manage.py migrate

我们需要两个html做演示

login.html

    
login

backend.html

    
backend

cookie 内容是 {
{ cookie_content }}

session 内容是 {
{ session_content }}

登录用户名 :{
{ username }}

注销

views.py

# /usr/bin/env python# coding:utf-8from django.shortcuts import renderfrom django.shortcuts import redirectdef login(request):    if request.method=="POST":        username=request.POST['username']        pwd=request.POST['passwd']        if username=='abc' and pwd=='123':            #设置session内部的字典内容            request.session['is_login']='true'            request.session['username']='abc'            #登录成功就将url重定向到后台的url            return redirect('/backend/')    #登录不成功或第一访问就停留在登录页面    return render(request,'login.html')def backend(request):    """    这里必须用读取字典的get()方法把is_login的value缺省设置为False,    当用户访问backend这个url先尝试获取这个浏览器对应的session中的    is_login的值。如果对方登录成功的话,在login里就已经把is_login    的值修改为了True,反之这个值就是False的    """    is_login=request.session.get('is_login',False)    #如果为真,就说明用户是正常登陆的    if is_login:        #获取字典的内容并传入页面文件        cookie_content=request.COOKIES        session_content=request.session        username=request.session['username']        return render(request,'backend.html',                      {            'cookie_content':cookie_content,            'session_content':session_content,            'username':username                      })    else:        """        如果访问的时候没有携带正确的session,        就直接被重定向url回login页面        """        return redirect('/login/')def logout(request):    """    直接通过request.session['is_login']回去返回的时候,    如果is_login对应的value值不存在会导致程序异常。所以    需要做异常处理    """    try:        #删除is_login对应的value值        del request.session['is_login']    except KeyError:        pass    #点击注销之后,直接重定向回登录页面    return redirect('/login/')

urls.py

from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = [    url(r'^admin/', admin.site.urls),    url(r'^login/', views.login),    url(r'^backend/', views.backend),    url(r'^logout/', views.logout),]

最后打开浏览器直接访问/backend/页面的时候直接就被重定向到了/login/

只有在输入了正确的用户名和密码之后才进入到了/backend/页面

从上图中我们看到有一下几点:

1、login页面正确登录的话,后台页面可以获取到浏览器携带的cookie的。

2、第一行的sessionid其实就是cookie值

3、session的内容是加密的,从获取不到session的内容

4、可以通过预设的key值取出session的内容并打印到前段

从火狐浏览器里查看cookie

django的session默认是存储在里的,我们再到数据库查看一下真正session内容

 

 

下面我们再来最后的总结一下cookie和session的知识点

session:

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

1、数据库Session

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。 a. 配置 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,默认修改之后才保存(默认)   b. 使用     def index(request):        # 获取、设置、删除Session中数据        request.session['k1']        request.session.get('k1',None)        request.session['k1'] = 123        request.session.setdefault('k1',123) # 存在则不设置        del request.session['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失效日期小于当前日期的数据删除        request.session.clear_expired()         # 检查 用户session的随机字符串 在数据库中是否        request.session.exists("session_key")         # 删除当前用户的所有Session数据        request.session.delete("session_key")         ...

2、缓存Session

a. 配置 settings.py     SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置      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,默认修改之后才保存   b. 使用     同上

4、缓存+数据库Session

数据库用于做持久化,缓存用于提高效率 a. 配置 settings.py     SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎 b. 使用     同上

5、加密cookie Session

a. 配置 settings.py         SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎 b. 使用     同上

扩展:Session用户验证

def login(func):    def wrap(request, *args, **kwargs):        # 如果未登陆,跳转到指定页面        if request.path == '/test/':            return redirect('http://www.baidu.com')        return func(request, *args, **kwargs)    return wrap

 

转载于:https://www.cnblogs.com/935415150wang/p/7464220.html

你可能感兴趣的文章
每日一篇——lodash——array——chunk
查看>>
[译文] 如何在 Node.js 中使用 ES6 语法的 import/export
查看>>
js使用dispatchEvent派发自定义事件
查看>>
Java程序员从阿里、百度面试回来,这些面试题你们会吗?
查看>>
你知道我们平时在CSS中写的%都是相对于谁吗?
查看>>
如何使用 GitHub Flow 给开源项目贡献代码
查看>>
声明 NSString 类型的属性,到底用 strong 还是 copy ?
查看>>
gulp如何打包css、sass编译、自动加css前缀、js压缩、es6转换es5
查看>>
用python批量替换MD文件中的图片地址
查看>>
Linux vi/vim编辑器按键说明
查看>>
Alfred配合翻译功能, 让英语更简单
查看>>
Java面试:投行的15个多线程和并发面试题
查看>>
天天生鲜项目学习之-项目创建
查看>>
数据结构与算法--排序(JS实现)
查看>>
面试知识点突击
查看>>
MySQL-训练题实践
查看>>
Quart2D 画图一 (简单画线、形状)
查看>>
javaScript(三):原型链(共用属性)
查看>>
free VIRL lab
查看>>
JS笔试题中的类型转换
查看>>