django中间件CBV添加装饰器

中间件CBV添加装饰器

一 django操作cookie补充

1.对于cookie加盐干扰项
  set_signed_cookie(key,value,salt='额外干扰项')
  set_signed_cookie(key,value,max_age=999999) 单位是秒,设置cookie的有效时间
2.退出登录做的操作
  HttpResponse对象.delete_cookie(key)
  cookie就是登录的存取

二 django操作session

1.设置session的值
  request.session['key']=value  # 可以设置多组
# 对于设置的session设置的kv键值对储存在数据库中的django_sission表中
2.获取session的值
  request.session.get('key',变量名)   # 可以获取多组
  在取值的时候就以key取值
3.设置session内部发生的事情
  第一就是产生一个随机字符串
  第二就是存储随机字符串与加密数据的对应关系
  第三就是产生的字符串也给客户端发送一份让其保存
  格式为:sessionid:随机字符串
4.获取session内部发送的事情
  第一自动获取客户端请求的随机字符串
  第二自动从储存session数据的表中对比
  第三如果比对成功自动获取并'加密处理'
# 对应django默认的session有效时间为14天

三 django操作session补充

1.request.session.session_key  # 获取产生的随机字符串
2.request.session.delete() # 值删除客户端的session数据
3.request.session.flush()  # 删除对应数据客户端的服务端
4.request.session.set_expiry(value) # 设置有效时间
  value如果是整数就表示秒
  如果value是datatime或者timedelta,就是设置的这个时间失效
  value是0就是关闭浏览器就会失效
  如果value是Nonesession会依赖全局session失效策略
5.session数据的储存位置物种方式
  数据库存储
  缓存存储
  文件存储
  缓存结合数据库存储
  动态加密

四 django中间件

1.django自带七个中间件每个对应个不同的功能
2.django支持自定义中间件并提供了五个方法
  process_request
  process_response
  process_view
  process_template_response
  process_excepton
3.django中间件的使用和场景:控制全局的相关功能可以再中间件中编写
   eg:用户黑名单校验,用户访问频率校验,网站全局用户身份校验

五 自定义中间件

1.创建一个文件夹
2.在该文件夹下创建一个人py文件
3.再py文件内编写中间件类
4.在配置文件中注册类似注册app一样
# 方法详解
  1.process_request
    当服务器收到请求之后会依次执行配置文件中的process_request方法,没有就跳过,如果改方法返回了自己的HttpPesponse对象,那么直接返回相应的数据
   2.process_response
     在执行了视图函数之后会将配置中间件从下往上执行它里面的process_respon方法,如果该方法返回了自己的HttpResponse对象,就等于将将视图函数返回的对象替换了,正常来说该方法一般返回reponse
# 了解的方法
  1.process_view 
    路由匹配成功之后执行视图函数之前从上往下执行中间件中的process_view
  2.process_template_reponse
    视图函数执行完毕之后返回的对象中含有的render属性对应的render方法才会从下往上执行配置文件的中间件内的process_template_reponse
  3.process_exception
     视图函数函数报错会执行配置文件中的中间件内的process_exception,从下往上

六 csrf跨站请求伪造

1.在登陆钓鱼网站之后通过制造一些与正常网址一样的页面来进行请求,请求地址是正规网址里面的,而对于设置一些无用的输入框隐藏了一些早就已经写好的文本框文本值
eg:
    <h2>我是钓鱼的网站</h2>
<form action="http://127.0.0.1:8000/ab_csrf/" method="post">
    <p>当前账户:<input type="text" name="current_user"></p>
    <p>目标账户:<input type="text"></p>
    <p style="display: none">目标账户:<input type="text" name="target_user" value="默认"></p>
    <p>转账金额:<input type="text" name="money"></p>
    <input type="submit">
</form>
# 将表单提交到正常网站中去

七 csrf解决策略

1.针对于form表单可以使用模板语法导入一个{% csrf_token %}
eg:
    <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>
2.针对于ajax请求现在页面任意位置导入{% csrf_token %}
 对于data的数据额外加上csrfmiddlewaretoken以这个为k键获取这个的值,就是模拟数据
这是csrf_token给网页打上的标记
  对于标签里的值可以正常获取标签值
  也可以模板语法获取{{ csrf_token }}
3.js脚本(适用于ajax)
  导入js脚本,然后就可以正常使用ajax了不需要多引入其他值

八 CBV添加装饰器

1.就是给视图类添加装饰器
2.导入模块
 from django.utilsdecorators import method_decorator
3.方式一:
class MyLoginView(views.View):
    @method_decorator(参数为装饰函数名)
    def get(self,requeest):
        rerurn HttpResponse('hhh')
方式二:
@method_decorator(装饰器名,name='类中函数名')
class MyLoginView(views.View):
    def get(self,request):
        return HttResponse('hhh')
方式三:
class MyLoginView(views.View):
    @method_decorator(装饰器函数名)
    def dispatch(self,request,*args,**kwargs)
    	super().dispatch(request,*args,**kwargs)
# 方式三重写了CBV内源码中的dispatch就是触发什么函数就装饰什么函数

九 对url加登录校验

def login_auth(func_name):
    def inner(request, *args, **kwargs):
        # print(request.path)
        # print(request.path_info)
        # 1.获取用户没有登录之前想要访问的网址地址
        target_path = request.get_full_path()
        if request.COOKIES.get('name'):
            res = func_name(request, *args, **kwargs)
            return res
        else:
            # 2.将用户想要访问的地址当做参数传给登录功能
            return redirect(f'/login/?next={target_path}')

    return inner
  
def login(request):
    if request.method == 'POST':
        name = request.POST.get("name")
        if name == 'jason':
            # 获取用户登录之前想要访问的地址
            next_path = request.GET.get('next')
            '''注意 用户也有可能直接访问的登录页面 没有想要访问的其他页面'''
            if next_path:
                res = redirect(next_path)  # 跳转到之前想要访问的界面
            else:
                res = redirect('/home/')  # 默认登录之后跳转的界面
            res.set_cookie('name', 'jason')
            return res
    return render(request, 'login.html')

posted on 2022-05-24 22:31  淦白嫖怪  阅读(49)  评论(0)    收藏  举报

导航