Django-Cookie和Session

Django-5

1.Coookie

1.1 什么是cookie

Cookie是储存在浏览器端的一小段文本数据(键值对). 被广泛用于在网站之间传输信息, 当您访问一个网站时,它会将一个Cookie发送到您的浏览器中,并在您返回该网站时读取该Cookie。

1.2 如何在django中使用cookie

设置cookie

rep = render(request, ....)
rep.set_cookie = {key: value}  # 设置cookie
"""
参数: key: 键  vlaue: 值
	max_age =  超时时间
	expires=None  超时时间
	path = '/'  生效路径
	secure = False  Https传输
	httponly = False  无法被js获取
"""    
request.COOKIES.get("...")  # 获取cookie
// 通过js操作cookie的值
// 1> 先导入jquery.cookie.js
// 2> 两种方式获取cookie的值
$.cookie.js
document.cookie

加盐的cookie:

# django加盐基于HMAC算法签名
rep.set_signed_cookie('username', '...', salt='salt')  # 加盐
rep.get_signed_cookie('username', salt='salt')  # 获取

2.装饰器基于FBV和CBV的应用

2.1 FBV的验证用户登录

def wrapper(func):
    def inner(request, *args, **kwargs):
        # 验证登录信息
        if not request.cookie.get('usernmae'):
            return redirect('/login/')
        ret = func(request, *args, **kwargs)  # 原函数
        return ret
    return inner

@wrapper
def home(request):
    return Http('登录成功')

2.2 CBV的验证用户登录

from django.utils.decorators import method_decorator

def wrapper(func):
    def inner(request, *args, **kwargs):
        # 验证登录信息
        if not request.cookie.get('usernmae'):
            return redirect('/login/')
        ret = func(request, *args, **kwargs)  # 原函数
        return ret
    return inner

@method_decorator(auth, name='dispatch')
class Home(views.View):
    # @method_decorator(auth)  # 相当于给所有映射关系都加装饰器
    # def dispatch(self, request, *args, **kwargs):
    #     return super(Order, self).dispatch(request, *args, **kwargs)
    
    def get(self, request):  # 固定方法
        print(request.method)  # GET
        return render(request, 'home.html')

    def post(self, request):  # 固定方法
        print(request.method)  # POST
        return render(request, 'home.html')

3.session

基于Cookie做验证时, 敏感信息不适合在cookie中

  1. session原理

cookie是存在用户浏览器的键值对

session是保存在服务器的键值对

  1. cookie和session对比

有效期不同,Cookie可设置为长时间保持,比如默认登录功能功能,Session一般有效时间较短,客户端关闭或者Session超时都会失效。 隐私策略不同,Cookie存储在客户端,信息容易被窃取;Session存储在服务端,相对安全一些。

  1. session配置

  2. 实例: 实现两周自动登录(默认)

request.session.set_expiry(60 * 10)
SESSION_SAVE_EVERY_REQUEST = TUUE

# 如果不设置超时时间, 表示关闭浏览器自动清除
  1. 服务器session
request.session.get()
request.session[x] = x

request.session.clear()
  1. 配置文件中的默认操作(通用配置)
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过期(默认)
# set_cookie('k',123)
SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
  1. session储存到三种级别的储存

默认不配置就会存储到数据库

下面是session储存到内存中文件中

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',  # 储存到内存中
        'LOCATION': 'unique-snowflake',
    }
}

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 储存到文件中
        'LOCATION': os.path.join(BASE_DIR, 'cache'),
    }
}
  1. session的使用

views.py

def login(request):
    if request.method == 'POST':
        from django.middleware.csrf import CsrfViewMiddleware
        username = request.POST.get('username')
        password = request.POST.get('password')
        # 生成随机字符串sessionId
        # 写到用户浏览的cookie
        # 保存到session中
        # 在随机字符串的字典中对应相关内容
        request.session['username'] = username
        request.session['password'] = password
        request.session.set_expiry(10)  # 设置session失效时间. 默认为两周
        request.session.clear()  # 清空当前用户的所有的session. 相当于loginOut

settings.py

SESSION_SAVE_EVERY_REQUEST = True  # 登录的失效时间按最后一次操作完之后计算

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',  # 储存到文件中
        'LOCATION': os.path.join(BASE_DIR, 'cache'),
    }
}
  1. 补充:

Session Cleanup机制会定期清理失效的session. 也可以使用命令cleansessions清理过期会话

posted on 2023-03-19 23:59  huxiaofeng  阅读(43)  评论(0)    收藏  举报

导航