Django中的cookies和session

时间:2024-11-16 19:56:44

Cookies :是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies。它保存在浏览器下的某个文件夹下。
Session:Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。

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

Cookie

1、获取Cookie:

['key']
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,...)
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    只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

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

<script src='/static/js/'></script>
$.cookie("list_pager_num", 30,{ path: '/' });

Session

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

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

1、数据库Session

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

a. 配置 

    SESSION_ENGINE = ''   # 引擎(默认)

    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中数据
        ['k1']
        ('k1',None)
        ['k1'] = 123
        ('k1',123) # 存在则不设置
        del ['k1']

        # 所有 键、值、键值对
        ()
        ()
        ()
        ()
        ()
        ()


        # 用户session的随机字符串
        .session_key

        # 将所有Session失效日期小于当前日期的数据删除
        .clear_expired()

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

        # 删除当前用户的所有Session数据
        ("session_key")

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

2、缓存Session

a. 配置 

    SESSION_ENGINE = ''  # 引擎
    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. 配置 

    SESSION_ENGINE = ''    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址()                                                            # 如:/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. 配置 

    SESSION_ENGINE = '.cached_db'        # 引擎

b. 使用

    同上

5、加密cookie Session

a. 配置 

    SESSION_ENGINE = '.signed_cookies'   # 引擎

b. 使用

    同上

扩展:Session用户验证

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

示例:

from  import render,redirect

# Create your views here.
import datetime

def login(request):
    print("COOKIES",)  #打印cookies 一个字典,里面多个键值对
    print("SESSION",)  #session为服务器对应客户信息的键

    if =="POST":
        name=("user")
        pwd=("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=()+(days=3))
            # return ret

            # COOKIE SESSION一起使用
            # session 以字典存放在服务器端,发给客户端的是数据对应的键,
            ["is_login"]=True  # 在session中增加键值对
            ["user"]=name

            return redirect("/index/")

    return render(request,"")

def index(request):

    if ("username",None):   # 取不到设置默认值为None
        name = ("username",None)
        return render(request, "", locals())

    # session验证 存在数据库中,所以要先makemigrations生成数据库
    if ("is_login",None):
        name=("user",None)
        return render(request,"",locals())
    else:
        return redirect("/login/")
##session获取
("user",None)
# 设置
["user"]=name
# 删除
del ("user")