• Django-(8)


    #内容概览

    • cookie与session简介
    • Django操作cookie
    • Django操作session
    • Django中间件

    cookie与session简介

    HTTP协议四大特性:

    1. 基于请求响应
    2. 基于TCP/IP作用于应用层之上协议
    3. 无状态
    4. 无连接
      随着互联网的发展,服务端需要记录客户端的状态,针对无状态的特性,就有了cookie与session
      cookie:保存在客户端上与用户信息相关的数据
      session:保存在服务端上与用户信息相关的数据
      ps:session的工作也需要cookie,目前所有能够识别用户身份的网址都使用到了cookie(客户端浏览器也可以拒绝保存cookie)

    Django操作cookie

    """如果想要让客户端浏览器保存cookie,需要使用HttpResponse对象调用方法"""
    def func01(request):
        obj = HttpResponse()
        obj.cookie方法
        return obj
    """render/redirect/JsonResponse等创建的对象都算是HttpResponse对象"""
    
    """删除cookie"""
    def func01(request):
    	obj = HttoResponse()
    	obj.delete_cookie('name')
    	return obj
    
    """cookie参数"""
    key			键
    value		值
    max_age		cookie最大生效时限
    expires		同上,针对IE浏览器
    path		cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
    domain		cookie生效的域名
    secure		https传输
    httponly	只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 登录设置cookie
    """使用户在登录时使用cookie记录"""
    def func01(request):
        obj = render(request, 'func01.html')
        if request.method == "POST":
            name = request.POST.get('username')
            obj.set_cookie('name', name)
            return obj
        return obj
    
    """设置页面需要登录后才能够访问"""
    def func02(request):
        if request.COOKIES.get('name'):  # 获取接收数据中cookie键为name的是否有值
            return render(request, 'func02.html')
        return redirect('/func01/')  # 如果没有值则重定向到登录页面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    func01.html:

    <form action="" method="post">
        <p><input type="text" name="username" placeholder="username">p>
        <p><input type="password" name="password" placeholder="password">p>
        <input type="submit" value="提交">
    form>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 多个视图函数都需要校验用户是否登录
    """多个函数都需要在使用校验校验用户身份,那么就该使用到装饰器了"""
    def login(func_name):
        def inner(request, *args, **kwargs):  # request是固定会传的,可以直接写在参数里,也可以不写直接使用args[0]
            if request.COOKIES.get('name'):
                res = func_name(request, *args, **kwargs)
                return res
            else:
                return redirect('/func01/')
        return inner
    
    
    @login
    def func03(request):
        return render(request, 'func03.html')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 让服务端记住用户登录前想访问的页面,登录成功后自动跳转
      想要能够跳转到用户之前想访问的页面首先需要获取用户想要访问页面的路由
      request.path
      request.path_info
      request.get_full_path
      一二都是只获取路由,第三个会获取包括问号后的所有数据
    """装饰器"""
    def login(func_name):
        def inner(request, *args, **kwargs):
            if request.COOKIES.get('name'):
                res = func_name(request, *args, **kwargs)
                return res
            else:
                i_path = request.path_info  # 获取路由
                return redirect(f'/func01/?i_path={i_path}')
        return inner
    
    """登录函数"""
    def func01(request):
        obj = render(request, 'func01.html')
        if request.method == "POST":
            i_path = request.GET.get('i_path')  # 获取GET中携带的路由
            if i_path:
                obj = redirect(i_path)  # 如果有,重定向去到用户想去的页面
            else:
                obj = redirect('home.html')  # 如果直接点登录,则登录完成后返回主页
            name = request.POST.get('username')
            obj.set_cookie('name', name)
            return obj
        return obj
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    Django操作session

    cookie通过每次访问自动发送数据算是解决了保存状态的需求,但是由于cookie本身最大只支持4096字节,以及数据存放在客户端,可能被拦截窃取安全性不高;所以就需要使用能够支持更多字节,并且保存在服务器使安全性更高的session
    session在请求来之后服务端产生随机字符串发送给客户端,服务端只需要保存随机字符串与用户信息之间的关系;之后客户端只需要使用随机字符串发送给服务端校验即可

    """
    django默认的session失效时间为14天
    客户端收到的键值对,键默认是sessionid,值是加密的字符串
    """
    	request.session['name'] = 'jason'
    	"""
    	django自动产生一个随机字符串返回给客户端(对name加密)
    	往django_session.创建数据(对jason加密,新项目需要先执行数据库迁移命令,否则没有表存放数据)	
    	"""
    	request.session.get('name')
    	"""
    	自动从请求中获取sessionid对应的随机字符串
    	拿着随机字符串去django_session中匹配数据
    	匹配成功会将数据解密当做返回值返回
    	"""
    
    """session其他操作"""
    1. 删除当前会话的所有session数据
    	request.session.delete()
    2. 删除当前会话数据并删除会话的cookie
    	request.session.flush()
    3. 设置会话session和cookie的失效时间
    	request.session.set_expiry()
    	# 如果参数是整数,那么session会在指定秒后失效
    	# 如果参数是时间对象(datetime/timedelta),那么session就会这个时间后失效
    	# 如果参数是0,那么用户关闭浏览器session就会失效
    	# 如果参数为None,那么session会依赖全局session失效策略
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    session的存储位置可以有五种模式

    4. 数据库Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    
    5. 缓存Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    6. 文件Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 
    
    7. 缓存+数据库
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    8. 加密Cookie Session
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎
    
    其他公用设置项:
    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    Django中间件

    所有请求与响应都必须经过中间件,django默认自带七个中间件,每个都负责各自的功能
    setting中自带的中间件:
    在这里插入图片描述

    django除了有默认的中间件,还支持自定义中间件
    django自定义中间件中有五个方法:
    process_request、process_response、process_view、process_template_response、process_exception

    1.process_request
    	1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
     	2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
    2.process_response
    	1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
     	2.该方法有两个形参request和response 并且默认情况下应该返回response
      	3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
    ps:如果请求的过程中process_request方法直接反悔了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)
    3.process_view
    	当路由匹配成功之后 执行视图函数之前 自动触发
    4.process_excption
    	当视图函数报错之后 自动触发
    5.process_template_response
    	当视图函数返回的数据对象中含有render属性对应render函数才会触发
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    Spring之文件上传下载,jrebel,多文件上传
    【Jenkins系列】-Pipeline语法全集
    Failed to configure a DataSource: ‘url‘ attribute is not specified and no em
    Web3项目灵魂所在之智能合约编写(Web3项目一实战之二)
    什么是JavaScript中的IIFE(Immediately Invoked Function Expression)?它的作用是什么?
    四甲基罗丹明TRITC修饰聚已内酯PCL载药纳米粒TRITC-PEG-PCL|TRITC-PCL
    Java GC
    LLMs 用强化学习进行微调 RLHF: Fine-tuning with reinforcement learning
    快速创建django项目管理系统流程
    简单代理模式
  • 原文地址:https://blog.csdn.net/AL_QX/article/details/126784508