发布于2019-08-06 10:06 阅读(1128) 评论(0) 点赞(5) 收藏(5)
定义:保存在浏览器本地上的一组组键值对
特点:
应用:
使用cookie的原因:因为HTTP是无状态的,用cookie来保存状态
在django中操作cookie
设置cookie:
# HttpResponse,render也可以
ret = redirect('/index')
ret.set_cookie('key',value,...) # Set-Cookie:key=value
ret.set_signed_cookie('key',value,salt='加密盐',...)
获取cookie:
request.COOKIES.get('key')
request.get_signed_cookie('key',salt='加密盐',default=RAISE_ERROR,max_age=None)
删除cookie:
def logout(request):
ret = redirect("/login/")
ret.delete_cookie("key") # 删除用户浏览器上之前设置的cookie值
return rep
cookie版登陆校验
from django.shortcuts import render, redirect, HttpResponse
from django.views import View
class Login(View):
def get(self, request, *args, **kwargs):
return render(request, 'login.html')
def post(self, request, *args, **kwargs):
username = request.POST.get('username')
pwd = request.POST.get('pwd')
if username == 'alex' and pwd == '123':
url = request.GET.get('return_url')
if url:
ret = redirect(url)
else:
ret = redirect('/index/')
# 设置 cookie
# ret['Set-Cookie'] = 'is_login=100; Path=/'
ret.set_cookie('is_login', '1') # 不加密的 Set-Cookie: is_login=1; Path=/
ret.set_signed_cookie('is_login', '1', 's21',max_age=10000,) # 加密的
return ret
return render(request, 'login.html', {'error': '用户名或密码错误'})
# 登录验证装饰器
def login_required(func):
def inner(request, *args, **kwargs):
# 获取 cookie
is_login = request.COOKIES.get('is_login') # 不加密的
is_login = request.get_signed_cookie('is_login', salt='s21', default='') # 加密的
print(is_login)
url = request.path_info
if is_login != '1':
return redirect('/login/?return_url={}'.format(url))
# 已经登录
ret = func(request, *args, **kwargs)
return ret
return inner
# 在需要在需要登录才能访问到页面的视图上加装饰器
@login_required
def index(request):
return HttpResponse('首页')
@login_required
def home(request):
return HttpResponse('home')
def logout(request):
ret = redirect('/login/')
ret.delete_cookie('is_login')
return ret
定义:保存在服务器上的一组组键值对(必须依赖cookie来使用)
使用session的原因:
总结:cookie弥补了HTTP无状态的不足,但是cookie以文本的形式保存在浏览器本地,自身安全性较差,所以我们通过cookie识别不同用户,对应的在session里保存私密信息以及超过4096字节的文本
在django中操作session
request.session['key'] = value
request.session.setdefault('key',value) # 设置默认值,存在则不设置
request.session['key']
request.session.get('key',None)
del request.session['key']
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
# 会话session的key
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")
# 删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie
request.session.flush()
# 这用于确保前面的会话数据不可以再次被用户的浏览器访问
# 例如,django.contrib.auth.logout() 函数中就会调用它
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
# 如果value是个整数,session会在些秒数后失效
# 如果value是个datatime或timedelta,session就会在这个时间后失效
# 如果value是0,用户关闭浏览器session就会失效
# 如果value是None,session会依赖全局session失效策略
session版登陆验证
from django.shortcuts import render, redirect, HttpResponse
from django.views import View
class Login(View):
def get(self, request, *args, **kwargs):
return render(request, 'login.html')
def post(self, request, *args, **kwargs):
username = request.POST.get('username')
pwd = request.POST.get('pwd')
if username == 'alex' and pwd == '123':
url = request.GET.get('return_url')
if url:
ret = redirect(url)
else:
ret = redirect('/index/')
# 设置 session
request.session['is_login'] = 1 # value可以设置为数字
# 设置会话Session和Cookie的超时时间,0表示用户关闭浏览器session就会失效
# request.session.set_expiry(0)
return ret
return render(request, 'login.html', {'error': '用户名或密码错误'})
# 登录验证装饰器
def login_required(func):
def inner(request, *args, **kwargs):
# 获取 session
is_login = request.session.get('is_login')
print(is_login)
url = request.path_info
if is_login != 1:
return redirect('/login/?return_url={}'.format(url))
# 已经登录
ret = func(request, *args, **kwargs)
return ret
return inner
# 在需要在需要登录才能访问到页面的视图上加装饰器
@login_required
def index(request):
# request.session.session_key:会话session的key
request.session.clear_expired() # 将失效的数据删除
return HttpResponse('首页')
@login_required
def home(request):
return HttpResponse('home')
def logout(request):
ret = redirect('/login/')
request.session.delete() # 删除session数据 不删除cookie
request.session.flush() # 删除session数据 并删除cookie
return ret
django中的session配置
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
# 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
SESSION_CACHE_ALIAS = 'default'
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
# 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
SESSION_FILE_PATH = None
4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用设置项:
# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_NAME = "sessionid"
# Session的cookie保存的路径(默认)
SESSION_COOKIE_PATH = "/"
# Session的cookie保存的域名(默认)
SESSION_COOKIE_DOMAIN = None
# 是否Https传输cookie(默认)
SESSION_COOKIE_SECURE = False
# 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_HTTPONLY = True
# Session的cookie失效日期(2周)(默认)
SESSION_COOKIE_AGE = 1209600
# 是否关闭浏览器使得Session过期(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# 是否每次请求都保存Session,默认修改之后才保存(默认)
SESSION_SAVE_EVERY_REQUEST = False
作者:放羊人
链接:https://www.pythonheidong.com/blog/article/7458/d8e4e591db3399c479d8/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!