一、session的设置
request.session["username"] = "smart"
request.session["age"] = 18
request.session.set_expiry(7*24*3600) # 设置session过期时间为一周后
二、获取session
username = request.session["username"]
age = request.session.get("age", "")
三、删除session
# 清除所有session
request.session.clear() # 只删除session中值得部分
# 删除所有session
# request.session.flush() # 删除session中的整条记录
# 删除key为age的session
del request.session["age"]
四、session的特点
五、session生成过程解析
"""
服务端保存用户相关状态信息 返回给客户端随机字符串
针对保存 django需要一张表来处理 >>> 自带的django_session表
ps:django数据库迁移命令会产生一堆默认的表 其中就有一张django_session表
"""
1.设置session内部发生的事情
1.产生一个随机字符串
2.表中存储随机字符串与加密数据的对应关系
3.并将产生的随机字符串也给客户端发送一份并让其保存
sessionid:随机字符串
2.获取session内部发送的事情
1.自动获取客户端请求中的随机字符串
2.自动去存储session数据的表中比对
3.如果比对成功自动获取并'解密处理'
六、知识点补充
session的过期时间设置
`session`的有效期时间是通过`request.session.set_expiry(value)`进行设置的。
1. 如果`value`是一个`int`类型,那么`session`将在`value`这个时间后过期,其中`value`代表的是秒。
2. 如果`value`是一个`datetime`或者`timedelta`对象,那么这个`session`将在指定的时间后过期。`datetime`必须是使用了`PickleSerializer`进行序列化的。
3. 如果`value`等于`0`,那么`session`将在web浏览器关闭后就直接过期。
4. 如果`value`等于None,那么`session`将用`settings.py`中设置的全局过期字段`SESSION_COOKIE_AGE`,这个字段默认是14天,也就是2个礼拜。
5. 读`session`的时候不会修改`session`的有效期,修改`session`的时候会重新设置`session`的有效期,会从修改的时间,重新计时。
6. 如果`settings.py`中设置了`SESSION_EXPIRE_AT_BROWSER_CLOSE=True`,那么默认讲不再使用`SESSION_COOKIE_AGE`了,而是浏览器一关闭,`session`数据就会过期。这个值默认是为`False`。
7. 判断是否在session里面:
"username" in request.session
8. 获取所有session的key和value
request.session.keys()
request.session.values()
request.session.items()
9.针对session数据的存储位置 有五种方案
1.数据库存储
2.缓存存储
3.文件存储
4.缓存+数据库存储
5.动态加密
需要借助于一个专门的装饰器模块
from django.utils.decorators import method_decorator
class MyLoginView(views.View):
@method_decorator(login_auth)
def get(self, request):
return HttpResponse("from CBV get view")
@method_decorator(login_auth, name='get')
class MyLoginView(views.View):
def get(self, request):
return HttpResponse("from CBV get view")
class MyLoginView(views.View):
@method_decorator(login_auth)
def dispatch(self, request, *args, **kwargs):
super().dispatch(request,*args,**kwargs)
Django 中间件是修改 Django request 或者 response 对象的钩子,可以理解为是介于 HttpRequest 与 HttpResponse 处理之间的一道处理过程。
浏览器从请求到响应的过程中,Django 需要通过很多中间件来处理,可以看如下图所示:
Django 中间件作用:
中间件组件配置在 settings.py 文件的 MIDDLEWARE 选项列表中。
配置中的每个字符串选项都是一个类,也就是一个中间件。
Django 默认的中间件配置:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
django不单有七个中间件并且每个都有很多功能和方法,除此之外django还支持自定义中间件并提供五个可以自定义的方法
django中间件的使用场景:只要是全局相关的功能都可以在中间件中编写
eg:用户黑名单校验、用户访问频率校验、网站全局用户身份校验
过程
必须要掌握的方法
1. process_request
请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法 如果没有则直接跳过
如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据
2. process_response
响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法 如果没有则直接跳过
如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据 而不再是视图函数想要返回给客户端的数据
如果process_request返回了HttpResponse对象 那么会从当前位置从下往上执行每一个process_response
需要了解的方法
process_view
路由匹配成功之后执行视图之前从上往下执行配置文件中注册了的中间件里面的process_view方法
process_template_response
视图函数执行完毕之后返回的对象中含有render属性对应一个render方法
则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法
process_exception
视图函数执行过程中报错并在返回响应的时候会从下往上执行配置文件中注册了的中间件里面的process_exception
CSRF的定义
CSRF(Cross-site request forgery)跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
可以这样来理解:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
CSRF的分类
CSRF的攻击过程
CSRF的攻击条件
Django提供的解决策略
针对csrf相关的校验有很多种方式 django只是提供了一些而已
<form action="" method="post">
{% csrf_token %}
<p>当前账户:<input type="text" name="current_user"></p>
<p>目标账户:<input type="text" name="target_user"></p>
<p>转账金额:<input type="text" name="money"></p>
<input type="submit">
</form>
方式1:
页面任意位置先写{% csrf_token %} 之后获取数据
'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()
方式2:模板语法直接获取
'csrfmiddlewaretoken':{{ csrf_token }}
补充:
通用解决方案:js脚本自动处理
也只能适用于ajax提交 form表单还是需要额外指定