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

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

Django中的cookie和session

Cookies :是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它收到服务器回发送过来的cookies。它保存在浏览器下的某个文件夹下。

Session:Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。

Session依赖于Cookie,如果浏览器不能保存cookies那么session就失效了。因为它需要浏览器的cookie值(sessionid)去session里做对比。session就是用来在服务器端保存用户的会话状态。

clipboard.png

Cookie

1、获取Cookie:

request.COOKIES[key]request.COOKIES.get(key)# 普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)参数:        default: 默认值        salt: 加密盐        max_age: 后台控制过期时间

2、设置Cookie:

rep = HttpResponse(...) 或 rep = render(request, ...)rep.set_cookie(key,value,...)# 给cookie签名rep.set_signed_cookie(key,value,salt='加密盐',...)    参数:        key,              键        value='',         值        max_age=None,     超时时间        expires=None,     超时时间(IE requires expires, so set it if hasn't been already.)        path='/',         Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问        domain=None,      Cookie生效的域名        secure=False,     https传输        httponly=False    True只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖),防止xss攻击

由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。

$.cookie("list_pager_num", 30,{ path: '/' });

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. 使用    同上

3、文件Session

a. 配置 settings.py    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T    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. 使用    同上

示例:

from django.shortcuts import render,redirect# Create your views here.import datetimedef login(request):    print("COOKIES",request.COOKIES)  #打印cookies 一个字典,里面多个键值对    print("SESSION",request.session)  #session为服务器对应客户信息的键    if request.method=="POST":        name=request.POST.get("user")        pwd=request.POST.get("pwd")        if name=="yuan" and pwd=="123":            # ret=redirect("/index/")            # 给对象ret设置cookie 安全性较差  ,设定有效时间max_age,expires,            # ret.set_cookie("username",{"11":"22"},max_age=10,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3))            # return ret            # COOKIE SESSION一起使用            # session 以字典存放在服务器端,发给客户端的是数据对应的键,            request.session["is_login"]=True  # 在session中增加键值对            request.session["user"]=name            return redirect("/index/")    return render(request,"login.html")def index(request):    if request.COOKIES.get("username",None):   # 取不到设置默认值为None        name = request.COOKIES.get("username",None)        return render(request, "index.html", locals())    # session验证 存在数据库中,所以要先makemigrations生成数据库    if request.session.get("is_login",None):        name=request.session.get("user",None)        return render(request,"index.html",locals())    else:        return redirect("/login/")##session获取request.session.get("user",None)# 设置request.session["user"]=name# 删除del request.session.get("user")

转载地址:http://ctuyx.baihongyu.com/

你可能感兴趣的文章
gauss消元
查看>>
多线程-ReentrantLock
查看>>
数据结构之链表与哈希表
查看>>
IIS7/8下提示 HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求...
查看>>
http返回状态码含义
查看>>
响应式网站对百度友好关键
查看>>
洛谷P2179 骑行川藏
查看>>
(十八)js控制台方法
查看>>
VB关键字总结
查看>>
虚拟机类加载机制
查看>>
android代码生成jar包并混淆
查看>>
Java基础2-基本语法
查看>>
一个不错的vue项目
查看>>
屏蔽指定IP访问网站
查看>>
python学习 第一天
查看>>
根据毫秒数计算出当前的“年/月/日/时/分/秒/星期”并不是件容易的事
查看>>
python的图形模块PIL小记
查看>>
shell变量子串
查看>>
iOS的主要框架介绍 (转载)
查看>>
react报错this.setState is not a function
查看>>