django框架11

内容概要


  • 用户登录之后跳转到用户登录之前想要访问的页面
  • django操作cookie补充
  • django操作session
  • django操作session补充
  • CBV添加装饰器
  • django中间件
  • 自定义中间件
  • csrf跨站请求伪造
  • csrf解决策略

内容详情


用户成功登录跳转到之前想要访问的页面

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')

django操作cookie补充

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

django操作session

# 设置
request.session['key'] = value  # 可以设置多组
# 获取
request.session.get('key')  # 可以获取多组
"""
服务端保存用户相关状态信息 返回给客户端随机字符串
针对保存 django需要一张表来处理 >>> 自带的django_session表
ps:django数据库迁移命令会产生一堆默认的表 其中就有一张django_session表
"""
1.设置session内部发生的事情
  1.产生一个随机字符串
  2.表中存储随机字符串与加密数据的对应关系 
  3.并将产生的随机字符串也给客户端发送一份并让其保存
    sessionid:随机字符串
2.获取session内部发送的事情
  1.自动获取客户端请求中的随机字符串
  2.自动去存储session数据的表中比对
  3.如果比对成功自动获取并'解密处理'
# 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数据的存储位置 有五种方案
  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")
# 方式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中间件

自定义中间件

csrf跨站请求伪造

csrf解决策略

posted @ 2022-05-25 23:27  弄臣  阅读(21)  评论(0编辑  收藏  举报