Cookie
- Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
- cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
- 设置cookie后会在浏览器的响应头增加一个key:value保存设置的cookie的数据(和重定向的原理一样),如下图,
- 设置cookie ret.set_cookie('is_login', 'True') ret可以是render, redirect, HttpResponse对象,因为他们都是HttpResponse对象
- 获取cookies request.COOKIES.get('is_login', '') 使用request对象获取cookie
from django.shortcuts import render, redirect, HttpResponse # Create your views here. def login(request): err_msg = '' if request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('pwd') if username == 'alex' and pwd == '123': ret = redirect('/index/') ret.set_cookie('is_login', 'True') return render(request,'index.html') else: err_msg = '用户名或密码错误' return render(request, 'login.html', {'err_msg': err_msg}) def index(request): if request.COOKIES.get('is_login', '') == 'True': # return HttpResponse('欢迎登陆') return render(request,'/index.html/') else: return redirect('/login/')
- 加盐cookie
- 设置 ret.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获取(不是绝对,底层抓包可以获取到也可以被覆盖)
- 获取 request.get_signed_cookie('key', default=RAISE_ERROR, salt='', max_age=None)
- default: 默认值
- salt: 加密盐
- max_age: 后台控制过期时间
- 删除Cookie ret.delete_cookie("login") # 删除用户浏览器上之前设置的login的cookie值
def logout(request): rep = redirect("/login/") rep.delete_cookie("user") # 删除用户浏览器上之前设置的user的cookie值 return rep
加盐cookie中文不能加密,使用utf-8编码然后加密,或者使用json转化,加密然后再转化回来
session
因为cookies保存在浏览器的响应头中,存储空间有限,且不安全,所以使用cookies + session保存用户信息
session
1. 保存在服务器上的键值对
2. 一个cookie对应一个session
流程:
1. 给首次登录的用户设置一个cookie session:asdasdasasdasdas
2. 开辟一块空间存session
3. session中存要存的数据(键值对)
4. 返回给浏览器cookie
# 设置session
request.session['is_login'] = 'True'
# 获取session
request.session.get('is_login', '')
request.session是个字典,所以字典有的方法都可以用
# 获取、设置、删除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的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失效策略。
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用
1. 数据库Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 2. 缓存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用设置项: 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,默认修改之后才保存(默认) Django中Session相关设置
from django.shortcuts import render, redirect, HttpResponse def login_required(func): def inner(request, *args, **kwargs): return_url = request.path_info if request.get_signed_cookie('is_login', '',salt='xxxx') == 'True': ret = func(request, *args, **kwargs) return ret else: return redirect('/login/?ReturnUrl={}'.format(return_url)) return inner def login(request): err_msg = '' if request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('pwd') if username == 'alex' and pwd == 'alexdsb': return_url = request.GET.get('ReturnUrl', '') if return_url: ret = redirect(return_url) else: ret = redirect('/index/') ret.set_signed_cookie('is_login', 'True', salt='xxxx') return ret else: err_msg = '用户名或密码错误' return render(request, 'login.html', {'err_msg': err_msg}) @login_required def index(request): return render(request, 'index.html', ) @login_required def home(request): return HttpResponse('这是home页面')
from django.shortcuts import render, redirect, HttpResponse def login_required(func): def inner(request, *args, **kwargs): return_url = request.path_info # if request.COOKIES.get('is_login', '') == 'True': if request.session.get('is_login', '') == 'True': # 获取session中的is_login,当没有时返回空字符串,不至于报错 print(request.session.session_key) ret = func(request, *args, **kwargs) return ret else: return redirect('/login/?ReturnUrl={}'.format(return_url)) return inner def login(request): err_msg = '' if request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('pwd') if username == 'alex' and pwd == 'alexdsb': return_url = request.GET.get('ReturnUrl', '') if return_url: ret = redirect(return_url) else: ret = redirect('/index/') # ret.set_cookie('is_login', 'True', max_age=60*60*24*7) # 设置session request.session['is_login'] = 'True' return ret else: err_msg = '用户名或密码错误' return render(request, 'login.html', {'err_msg': err_msg}) @login_required def index(request): return render(request, 'index.html', ) @login_required def home(request): return HttpResponse('这是home页面') @login_required def logout(request): rep = redirect("/login/") rep.delete_cookie("is_login") # 删除用户浏览器上之前设置的user的cookie值 return rep
from django.shortcuts import render, redirect, HttpResponse def login_required(func): def inner(request, *args, **kwargs): return_url = request.path_info # if request.COOKIES.get('is_login', '') == 'True': if request.session.get('is_login', '') == 'True': # 获取session中的is_login,当没有时返回空字符串,不至于报错 print(request.session.session_key) ret = func(request, *args, **kwargs) return ret else: return redirect('/login/?ReturnUrl={}'.format(return_url)) return inner def login(request): err_msg = '' if request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('pwd') if username == 'alex' and pwd == 'alexdsb': return_url = request.GET.get('ReturnUrl', '') if return_url: ret = redirect(return_url) else: ret = redirect('/index/') # ret.set_cookie('is_login', 'True', max_age=60*60*24*7) # 设置session request.session['is_login'] = 'True' return ret else: err_msg = '用户名或密码错误' return render(request, 'login.html', {'err_msg': err_msg}) @login_required def index(request): return render(request, 'index.html', ) @login_required def home(request): return HttpResponse('这是home页面') @login_required def logout(request): rep = redirect("/login/") request.session.delete() # 删除当前会话的所有Session数据 #request.session.flush() ## 删除当前的会话数据并删除会话的Cookie return rep 设置,获取,删除session,使用装饰器获取
CBV中使用装饰器,设置是否使用csrf中间件验证
记不住session配置命令时,在源码中查看
可以通过设置cookie来删除cookie
请求头携带cookie
响应头设置cookie
跳转验证cookie
一. cookie 1. cookie是什么? 服务器让浏览器保存在浏览器本地的键值对 2. 为什么要有cookie? http是无状态,每次请求之间没有任何关系,无法保存状态。 3. cookie的特点 1. 服务器让浏览器设置的 2. 设置之后每次访问相同的页面带上cookie 4. django中操作cookie 1. 设置cookie rep = redirect('/index/') rep.set_cookie(key,value,max_age=1000) rep.set_signed_cookie(key,value,max_age=1000,salt='') 2. 获取cookie request.COOKIES['key'] request.COOKIES.get('key') ——》推荐的取法 request.get_signed_cookie('key',salt='') request.method request.POST ——》POST请求提交的数据 {} request.GET ——》URL上的参数 /?id=11&name=xx request.FILES ——》上传的文件 3. 删除cookie rep.delete_cookie('key') 二. session 1.什么是session? session是保存在服务器上的键值对,依赖于cookie 2. 为什么要有session? cookie在浏览器端 不太安全 cookie长度受到限制 3. django中操作session 1. 设置session request.session['key'] = value request.session.setdefault(key,value) ——》 存在就不设置 2. 获取session request.session['key'] request.session.get(key,'') 3. 删除session request.session.pop(key) ——》 删除某一个键值对 del request.session['key'] request.session.delete() ——》删除所有的session键值对 request.session.flush() ——》删除所有的session键值对.删除了cookie 4. 设置超时时间 request.session.set_expiry() 5. 清除当前过期的session request.session.clear_expired() 4. session的其他的配置 SESSION_COOKIE_NAME = 'sessionid' # Age of cookie, in seconds (default: 2 weeks). SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # Whether to save the session data on every request. SESSION_SAVE_EVERY_REQUEST = False # Whether a user's session cookie expires when the Web browser is closed. SESSION_EXPIRE_AT_BROWSER_CLOSE = False 3. 装饰器 1. CBV加装饰器 from django.utils.decorators import method_decorator 2. 装饰器修复技术 from functools import wraps 3. csrf相关的装饰器 from django.views.decorators.csrf import csrf_exempt,csrf_protect