Django day11(django操作cookie、session CBV添加装饰器、中间件、csrf)

Django day11

携带参数的登录跳转作业
from django.shortcuts import render, HttpResponse, redirect


def login_auth(func_name):
    def inner(request, *args, **kwargs):
        # 1.获取用户没登录前想要访问的地址
        target_path = request.get_full_path()
        if request.COOKIES.get('name'):
            # 2.如果登录了就直接访问相应功能界面
            res = func_name(request, *args, **kwargs)
            return res
        else:
            # 3.跳转到登录界面 将用户想要访问的地址作为参数传给登录功能
            return redirect(f'/login/?next={target_path}')
    return inner


def login(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        if name == 'cc':
            # 获取登陆前想要访问的地址
            next_path = request.GET.get('next')
            if next_path:
                # true则跳转到登录前想要访问的界面
                res = redirect(next_path)
            else:
                # false表示直接访问的登录界面 默认登录后跳到主界面
                res = redirect('/home/')
            res.set_cookie('name', 'cc')
            return res
    return render(request, 'login.html')


@login_auth
def home(request):
    return HttpResponse('home页面 登录才可进')


@login_auth
def index(request):
    return HttpResponse('index页面 登录才可进')


@login_auth
def func(request):
    return HttpResponse('func页面 登录才可进')


@login_auth
def logout(request):
    res = redirect('/login/')
    res.delete_cookie('name')
    return res

django操作cookie补充

set_signed_cookie(key,value,salt='加密盐')
set_signed_cookie(key,value,max_age=超时时间:默认是秒数)
expires:专门针对IE浏览器设置超时时间
  
HttpResponse对象.delete_cookie(key) 
# 登录操作的本质:核心就是cookie的存取

django操作session

# 设置
request.session['key'] = value	# 可设置多组 
# 获取
request.session.get('key')	# 可获取多组

'''
服务端保存用户相关状态信息 返回给客户端随机字符串
针对保存 django需要一张表来处理>>> 自带的django_session表
django数据库迁移命令会生成一堆默认表 其中就有django_session表
'''

1.设置session内部发生的事情
    产生一个随机字符串
    django_session表中储存随机字符串与加密数据的对应关系
    将产生的随机字符串也给客户端发送一份并让其保存
    'sessionid:随机字符串'
2.获取session内部发生的事情
    自动获取客户端请求中的随机字符串
    自动去存储session数据的表中对比
    如果对比成功自动获取并'解密处理'
    
# django默认的session失效时间为14天

django操作session补充

request.session.session_key	# 获取产生的随机字符串
request.session.delete()	# 只删客户端
request.session.flush()		# 客户端、服务端都删
request.session.set_expiry(value)  # 设置超时时间
    * 如果value是个整数,session会在这些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。    
针对session数据的存储位置(5种方案)
    1.数据库存储
    2.缓存存储
    3.文件存储
    4.缓存+数据库存储
    5.动态加密

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')
    def post(self, request):
        return HttpResponse('from cbv post view')
# 方式2:直接在类名上添加并指定
@method_decorator(login_auth, name='get')
class MyLoginView(views.View):
    def get(self, request):
        return HttpResponse('from cbv get view')
    def post(self, request):
        return HttpResponse('from cbv post view')
# 方式3:重写dispatch方法并添加作用到类中所有的方法
class MyLoginView(views.View):
    def get(self, request):
        return HttpResponse('from cbv get view')

    def post(self, request):
        return HttpResponse('from cbv post view')

    @method_decorator(login_auth)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

django中间件

django中间件是django的门户 
自带七个(可在settings.py内MIDDLEWARE查看) 每个都有其对应的功能

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

django中间件的使用场景:只要是全局相关的功能都可以在中间件中编写
  	eg:用户黑名单校验、用户访问频率校验、网站全局用户身份校验

自定义中间件

"""
1.创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内编写中间件类
4.配置文件中注册
"""

必须要掌握的方法

1.process_request
  	请求来的时候会从上往下依次执行配置文件中注册了的中间件里面的process_request方法 如果没有则直接跳过
        如果该方法自己返回了HttpResponse对象,那么请求不再继续往后直接返回相应的数据
2.process_response
  	响应走的时候会从下往上依次执行配置文件中注册了的中间件里面的process_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跨站请求伪造

# 前戏
	钓鱼网站:一个模仿正规网站的网址 诱骗用户在该网站上做本应该在正规网站上做的操作,从而获取到该用户在正规网站上的数据甚至是财产
  eg:假设我们需要登录网页完成转账操作
    我们不小心登录到了钓鱼网站 填写了账户 密码 对方账户等信息
    点击转账之后我们账户的钱确实减少了 但是对方账户却变成了一个你从来不认识的人
  原理:将收款人的账号 提前写成犯罪分子的然后隐藏 暴露给用户一个没有name属性的标签写着玩

csrf解决策略

"""针对csrf相关的校验有很多种方式 django只是提供了一些而已"""

# form表单
<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 }}

"""通用解决方案:js脚本自动处理"""
	也只能适用于ajax提交  form表单还是需要额外指定
posted @ 2022-05-24 21:51  扶我上码  阅读(33)  评论(0)    收藏  举报