• 欢迎光临~

Django框架11

开发技术 开发技术 2022-05-24 次浏览

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的中间件

Django请求生命周期流程图:

 

简介:

Django中间件是Django的门户;Django自带7个中间件,每个中间件都有各自对应的功能。
1、请求来的时候需要先经过中间件才能到达真正的django后端
2、响应走的时候最后也需要经过中间件才能发送出去

Django中间件的使用场景:

只要涉及到全局相关功能都可以使用中间件方便完成。

eg:

1、全局身份校验:用户黑名单校验
2、全局访问频率校验:用户访问频率校验
3、全局权限校验:网站全局用户身份校验

自定义中间件

Django不单有七个中间件,并且每个都有很多功能和方法,除此之外Django还支持自定义中间件并提供五个可以自定义的方法。

如何自定义中间件:

1、在项目名或者应用名下创建一个任意名称的文件夹
2、在该文件夹创建一个任意名称的py文件
3、在该py文件内需要书写中间件类(这个类必须要继承MiddlewareMixin)
      然后在这个类里面就可以自定义5个方法,(这5个方法并不是全部都需要书写,用几个写几个)
4、需要将类的路径以字符串的形式注册到配置文件中才能生效

两个自定义方法:

  • process_request方法

process_request方法就是用来做全局相关的所有限制功能。

'''
请求来的时候需要经过每一个中间件里面的process_request方法;

结果的顺序是按照配置文件中注册的中间件从上往下的顺序依次执行;

如果中间件里面没有定义该方法,那么直接跳过执行下一个中间件

如果该方法返回HttpResponse对象,那么请求将不再继续往后执行,而是直接原路返回(校验失败不允许访问...)
'''
  • process_response方法
'''
响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_response方法,如果没有,则直接跳过执行下一个。

process_response方法必须要返回一个HttpResponse对象;默认返回的就是形参response;

如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据,而不再是视图函数想要返回给客户端的数据。

如果第一个process_request方法已经返回了HttpResponse对象;那么响应走的时候,就会从当前位置从下往上执行每一个process_response。


'''
  • 了解的方法
'''
1.process_view
    路由匹配成功之后执行视图之前,会从上往下执行配置文件中注册了的中间件里面的process_view方法
2.process_template_response
    视图函数执行完毕之后,返回的对象中含有render属性才会触发,对应一个 
    render方法;则会从下往上执行配置文件中注册了的中间件里面的 
    process_template_response方法
3.process_exception
    视图函数执行过程中出现异常的情况触发,报错并在返回响应的时候会从 
    下往上执行配置文件中注册了的中间件里面的process_exception
'''

csrf跨站请求伪造

简介:

钓鱼网站:

一个模仿正规网站的网址,诱骗用户在该网站上做本应该在正规网站上做的操作,从而获取到该用户在正规网站上的数据甚至是财产。

在钓鱼网站的页面,针对对方账户,只给用户提供一个没有name属性的普通input框,然后我们在内部隐藏一个已经写好的name和value的input框。

eg:

'''
假设我们需要登录网页完成转账操作
我们不小心登录到了钓鱼网站 填写了账户 密码 对方账户等信息
点击转账之后我们账户的钱确实减少了 但是对方账户却变成了一个你从来不认识的人
原理:将收款人的账号 提前写成犯罪分子的然后隐藏 暴露给用户一个没有name属性的标签写着玩
'''

csrf跨站请求伪造:

'''
网站在给用户返回一个具有提交数据功能页面的时候会给这个页面加一个唯一标识
当这个页面朝后端发送post请求的时候,我们后端会先校验唯一标识,如果唯一标识
不对直接拒绝(403 forbbiden)如果成功则正常执行
'''

csrf解决策略:

针对csrf相关的校验有很多种方式,Django只是提供了一些方法而已。

  • form表单

{ % csrf_token % }

<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、利用标签查找获取页面上的随机字符串

# 页面任意位置先写{% csrf_token %} 之后获取数据

'csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()

2、利用模语法提供的快捷书写直接获取

'csrfmiddlewaretoken':{{ csrf_token }}

3、通用方法是js脚本自动处理,直接拷贝js代码并应用到自己的html页面

# 也只能适用于ajax提交,form表单还是需要额外指定

 

程序员灯塔
转载请注明原文链接:Django框架11
喜欢 (0)