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中
- session原理
cookie是存在用户浏览器的键值对
session是保存在服务器的键值对
- cookie和session对比
有效期不同,Cookie可设置为长时间保持,比如默认登录功能功能,Session一般有效时间较短,客户端关闭或者Session超时都会失效。 隐私策略不同,Cookie存储在客户端,信息容易被窃取;Session存储在服务端,相对安全一些。
-
session配置
-
实例: 实现两周自动登录(默认)
request.session.set_expiry(60 * 10)
SESSION_SAVE_EVERY_REQUEST = TUUE
# 如果不设置超时时间, 表示关闭浏览器自动清除
- 服务器session
request.session.get()
request.session[x] = x
request.session.clear()
- 配置文件中的默认操作(通用配置)
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,默认修改之后才保存(默认)
- 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'),
}
}
- 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'),
}
}
- 补充:
Session Cleanup机制会定期清理失效的session. 也可以使用命令cleansessions清理过期会话
本文来自博客园,作者:{Max},仅供学习和参考
posted on 2023-03-19 23:59 huxiaofeng 阅读(43) 评论(0) 收藏 举报
浙公网安备 33010602011771号