【0】cookie、session和Token的发展史
【1】Cookie的形式
- 存储形式:k:v键值对
- 存储位置:客户端
- 缺点:不安全,信息可能会泄露
【2】session的形式
- 标识符,表示我是当前用户加密出来的数据
- 对敏感信息进行加密处理
- 存储服务端
- 标识符配合上你的加密串
- 把某个数据的标识符+字符串全给服务端
- 客户端存储格式
- session_id:返回回来的标识符+加密串
- 客户端存储格式
【3】Cookie方法
【3.1】设置Cookie
obj = HttpResponse('ok')
obj.set_cookie('K','V')
'''
HttpResponse:django的三板斧,返回的是字符串
.set_cookie('k','v') ------------- 设置cookie k:key值 v:value值
设置cookie是不只是使用django三板斧中的HttpResponse,其余两个都能使用
'''
【3.2】cookie取值
request.COOKIES.get('k')
【3.3】设置过期时间
obj.set_cookie('k','v',expires=3)
obj.set_cookie('k','v',max_age=3)
'''
expires:设置超时时间,单位为秒
max_age:设置超时时间,单位为秒
'''
【3.4】删除cookie
def logout(request,*args,**kwargs):
obj = redirect('/home/')
obj.delete_cookie('sign')
return obj
【4】Session
【4.1】session注意事项
- session基于数据库表才能使用
- 必须先迁移数据库,生层django_session表
- session只对当次登录有效
- 主动清除浏览器中本地存在的session
- 验签发现,没有sessionid就会生成新的session
- django_session表中的数据取决于浏览器
- 同一个计算机(IP地址)上同一个浏览器只会有一条数据生效
- 同一个计算机(IP地址)上多个浏览器会有多个数据生效
- 当session过期的时候,可能会出现多条数据对应一个浏览器
- 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除
- 目的是为了节省服务器数据库资源
【4.2】设置session
request.session['sign'] = 'user'
'''
sign -------- k值
user -------- v值
'''
【4.3】session取值
sign = request.session.get('sign')
【4.4】session设置过期时间
# 设置session
request.session['key'] = 'value'
# 设置过期时间
request.session.set_expiry()
'''
参数:
1、整数:设置多少秒过期
2、日期:设置到指定日期失效
3、0:退出浏览器失效
4、不写:失效时间取决于Django内部全局session失效的时间
'''
【4.5】清空session
def clear_session(request):
request.session.delete()
'''
request.session.delete(): 只删除服务端
1、该方法用于删除当前用户的Session数据,但会保留Session的Key
2、这意味着Session对象本身仍然存在,但其中的数据将被清空
3、下次访问时,如果Session没有被重新填充,则会得到一个空的Session对象
简而言之,就是使用request.session.delete()方法,会删除浏览器端的session,数据库中的数据不会被删除
'''
def clear_session(request):
request.session.flush()
'''
request.session.flush():服务端和客户端都删除
该方法用于完全删除当前用户的Session,包括Session对象和所有相关数据
下次访问时,将创建一个新的空Session对象
简而言之,就是删除了浏览器端和数据库中的session
'''
【4.6】保存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,默认修改之后才保存(默认)
【5】CBV加装饰器的三种方法
from django.utils.decorators import method_decorator
# 方式二:放在类视图上面 (放的装饰器函数,name指定你的视图函数里面的方法)
# @method_decorator(login_auth, name='get')
# @method_decorator(login_auth, name='post')
class UserView(View):
# 方式三 : dispactch 方法加装饰器 : 本视图函数内所有的视图都需要走装饰器
@method_decorator(login_auth)
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
# 方式一:加在视图函数上面
# @method_decorator(login_auth)
def get(self, request, *args, **kwargs):
return HttpResponse("这是home页面")
【5.1】补充
CSRF Token相关装饰器在CBV只能加到dispatch方法上
或者加在视图类上然后name参数指定为dispatch方法。
备注:
csrf_protect ----------无论settings.py文件中的中间件中的csrf有没有被注释掉都会报错
1、为当前函数强制设置防跨站请求伪造功能
2、即便settings中没有设置中间件
from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.utils.decorators import method_decorator class HomeView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(HomeView, self).dispatch(request, *args, **kwargs) def get(self, request): return render(request, "home.html") def post(self, request): print("Home View POST method...") return redirect("/index/")
csrf_exempt ---------- settings.py文件中的中间件中的csrf没有注释掉也不会报错
1、取消当前函数防跨站请求伪造功能
2、即便settings中设置了全局中间件
from django.views.decorators.csrf import csrf_exempt, csrf_protect from django.utils.decorators import method_decorator @method_decorator(csrf_exempt, name='dispatch') class HomeView(View): def dispatch(self, request, *args, **kwargs): return super(HomeView, self).dispatch(request, *args, **kwargs) def get(self, request): return render(request, "home.html") def post(self, request): print("Home View POST method...") return redirect("/index/")