Django中cookie的使用、session的使用、cbv添加装饰器、中间件、csrf介绍
今日学习内容总结
Django中cookie的使用
cookie的增删改查
1. 增: obj.set_cookie('key', 'value')
2. 删: obj.delete_cookie('key')
3. 改: obj.set_cookie('key', 'value')
4. 查: request.COOKIE.get('key')
增删改查的代码示例
增
def cookie_test(request):
# obj1 = HttpResponse()
# return obj1
# obj2 = render(request,'cookie_test.html')
# return obj2
obj = HttpResponse('生成了两个cookie')
# 设置cookie
obj.set_cookie('name','shawn')
obj.set_cookie('pwd','123')
return obj
删
# 删除cookie
def del_cookie(request):
obj = HttpResponse('删除了一个cookie')
obj.delete_cookie('name')
return obj
改
# 更新cookie,与设置一样
def set_cookie(request):
obj = HttpResponse('重新对cookie进行了设置')
obj.set_cookie('name','xing')
obj.set_cookie('pwd','11122')
return obj
查
# 获取cookie
def get_cookie(request):
name = request.COOKIES.get('name')
pwd = request.COOKIES.get('pwd')
return HttpResponse(f'获取到cookie,name:{name},pwd:{pwd}')
更多操作
cookie加盐
# 为cookie进行加盐
def set_salt(request):
obj = HttpResponse('为name加了个盐中盐')
obj.set_cookie('name', 'shawn')
# 加盐操作
obj.set_signed_cookie('name', 'shawn', salt='盐中盐')
return obj
# 获取加盐的cookie
def get_salt(request):
name_salt = request.COOKIES.get('name')
salts = request.get_signed_cookie('name', salt='盐中盐')
return HttpResponse(f'获取到加盐的cookie名:{salts}\n加盐后的cookie:{name_salt}')
设置超时时间, 直接在设置cookie的时候加参数
# expires常用,支持IE浏览器(以秒为单位)
def set_timeout(request):
obj = HttpResponse('超时删除cookie')
obj.set_cookie('name', 'shawn', max_age=5) # 5秒删除
obj.set_cookie('pwd', '123445', expires=6) # 6秒删除
return obj
Django中session的使用
session的增删改查
增
def set_session(request):
request.session['name'] = 'song'
request.session['pwd'] = '123'
return HttpResponse('设置了一个session')
删
# 方式1
def del_session(request):
name1 = request.session.get('name')
del request.session['name'] # 删除session中的name信息
name2 = request.session.get('name')
pwd = request.session['pwd']
return HttpResponse(f'只删除name,删除前name:{name1},删除后再获取name:{name2},pwd:{pwd}还在')
# 方式2
def del2_session(request):
request.session.delete() # 删除数据库(服务端)
request.session.flush() # 删除cookie和数据库(客户端和服务端)
return HttpResponse('删除,去刷新数据库可以发现空了')
改
def update_session(request):
name1 = request.session.get('name')
request.session['name'] = 'shawn'
name2 = request.session.get('name')
return HttpResponse(f'修改前{name1},修改后{name2}')
查
def get_session(request):
name = request.session.get('name')
pwd = request.session['pwd'] # 两种方法都可以(这种找不到会报错)
return HttpResponse(f'获取到session:{name}-{pwd}')
session的其他方法
request.session.set_expiry(value) # 设置超时时间
1. 如果value是个整数,session会在些秒数后失效。
2. 如果value是个datatime或timedelta,session就会在这个时间后失效。
3. 如果value是0,用户关闭浏览器session就会失效。
4. 如果value是None,session会依赖全局session失效策略。
针对session数据的存储位置,有五种方案。
1.数据库存储
2.缓存存储
3.文件存储
4.缓存+数据库存储
5.动态加密
cbv添加装饰器
cbv添加装饰器有三种方式添加,需要借助于一个专门的装饰器模块。
from django.utils.decorators import method_decorator
# 方式1 直接在类中的某个方法上添加
class MyLoginView(views.View):
@method_decorator(login_auth)
def get(self, request):
return HttpResponse("from CBV get view")
# 方式2:直接在类名上添加并指定
@method_decorator(login_auth, name='get')
class MyLoginView(views.View):
def get(self, request):
return HttpResponse("from CBV get view")
# 方式3:重写dispatch方法并添加作用于类中所有的方法
class MyLoginView(views.View):
@method_decorator(login_auth)
def dispatch(self, request, *args, **kwargs):
super().dispatch(request,*args,**kwargs)
Django中间件
中间件简介
中间件是一个很大的概念, 它介于两个事务之间:
1. 服务器中间件:服务器的调优,例:Java的Tomcat
2. 消息队列中间件:消息队列,在应用程序与应用程序之间,
3. 数据库中间件:应用程序与数据库之间
Django中间件简介
1. 请求来的时候需要先经过中间件才能到真正的Django后端
2. 响应走的时候也需要经过中间件才能发送出去
3. 通俗的讲 : 中间件相当于是Django的门户, 你进来时要经过它, 出去的时候也要经过它
4. 介于request与response处理之间的一道处理过程, 并且在全局上改变django的输入与输出
Django自带的中间件
Django自带的中间件有七个, 在 setting.py 配置文件中, 每个中间件其实就是一个类,每个都有各自对应的功能。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', # 处理session
'django.middleware.common.CommonMiddleware', # 处理路由匹配是否带斜杠
'django.middleware.csrf.CsrfViewMiddleware', # 跨站请求伪造处理
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
中间件的作用
既然请求来和响应走都经过中间件, 那么我们就可以对所有的请求做一些预处理, 对所有返回的响应也可以做处理。

中间件的主要方法介绍
可以通过查看Django自带中间件的源码查看他们一般都有什么方法 : (五种)
| 中间件方法 | 描述 |
|---|---|
| process_request(self,request)(常用) | 所有请求来时都会运行的方法 |
| process_view(self, request, callback, callback_args, callback_kwargs) | 所有路由匹配成功之后,跳转执行视图函数之前都会运行该方法 |
| process_exception(self, request, exception) | 所有视图中有异常发生时运行的方法 |
| process_response(self, request, response)(常用) | 所有返回页面响应时运行的方法 |
| process_template_response(self,request,response) | 返回的HttpResponse对象具有render属性时才会触发该方法 |
并不是每个中间件都有这五个方法, 只是需要什么方法就有什么方法。
自定义中间件
中间件的执行顺序
1. 请求来时,自上而下顺序执行
2. 响应走时,自下而上顺序执行
自定义中间件步骤
1.先在项目名目录或者应用名目录下创建一个任意名字的文件夹(最好见名知意)
2.在该文件夹下创建任意名字的py文件(最好见名知意)
3.在该py文件内书写类, 在类中书写中间件的五种方法
- 类必须继承MiddlewareMixin, 五种方法并不是全都要写,需要几种写几种
4.将类的路径以字符串的形式注册到settings.py配置文件中的MIDDLEWARE下(与app注册原理类似)
中间件方法的使用
process_request( ), process_response( )
process_request
1. 请求来的时候会依此走 MIDDLEWARE 中定义的该方法, 如果中间件没有定义就跳过
- 执行顺序: MIDDLEWARE 中从上到下
2. 如果返回 HttpResponse 对象, 请求将不会继续往后执行, 而是原路返回
- 目的: 用来做全局相关的所有限制功能
- 应用: 校验失败不允许访问
process_response
1. 响应走的时候会依此走 MIDDLEWARE 中定义的该方法, 如果中间件没有定义就跳过
- 执行顺序: MIDDLEWARE 中从下到上
2. 该方法必须返回 HttpResponse 对象
- 默认返回形参response
- 返回自定义的
process_view( ), process_template_response( ), process_exception( )
process_view
- 路由匹配之前或者执行视图函数之前时触发
- 执行顺序: MIDDLEWARE 中从上到下
process_template_response
- 视图函数返回结果中含有render属性是触发
- 执行顺序: MIDDLEWARE 中从下到上
process_exception
- 视图函数出现异常时触发
- 执行顺序: MIDDLEWARE 中从下到上
CSRF跨站请求伪造
CSRF 简介
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
简单理解就是黑客盗用你的身份, 以你的身份来进行一系列操作(发送恶意请求,发消息,购物,转账等等), 这些操作对于服务器来说是完全合法的, 因为你的身份就是一个正常的用户。
csrf 攻击原理示例
以银行转账为例

正常用户登入受信任的网站A, 并在本地生成Cookie,在没有登出网站A的情况下(也就是没有清除Cookie), 访问了黑客网站B,B网站中有一个虚假按钮, 背后对应的就是向别人转账, 但用户并不知道, 点击之后会带着用户的Cookie进行转账。
csrf 解决策略
针对csrf相关的校验有很多种方式,django只是提供了一些而已。
from表单
<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>
ajax请求
1.方式1:页面任意位置先写{% csrf_token %} 之后获取数据
'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()
2.方式2:模板语法直接获取
'csrfmiddlewaretoken':{{ csrf_token }}

学习内容总结
浙公网安备 33010602011771号