ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【2022.9.12】cookie与session/Django操作cookie/Django操作session/Django中间件

2022-09-12 23:04:15  阅读:331  来源: 互联网

标签:return 中间件 request Django session cookie obj


今日内容概要

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

cookie与session简介

  • 推导与介绍
# 推导:
	HTTP协议四大特性:
        1.基于请求响应
        2.基于TCP、IP作用于应用层之上协议
        3.无状态
        	意思为:服务端记不住无法识别客户端的状态
            (1).最初互联网的发展 网页简单 每个用户都一样
            (2).随着互联网发展(支付宝等) 服务端需要记住每个用户的信息 业务才能发展
            (3).cookie与sess应运而生
         4.无连接/短连接  

        
        
# 介绍:

cookie:
	保存在客户端上跟用户信息状态相关的数据
    
session:
	保存在服务端上跟用户信息状态相关的数据
    
"""
session的工作主要依赖于cookie  
因为所有的服务端有关于用户的信息数据都是基于cookie才能得到  目前所有能够识别用户身份的网址也都需要使用cookie
当让客户端浏览器也有权利拒绝保存cookie

"""    
    
    
  • 1、如果想要让客户端浏览器保存cookie需HttpResonse对象调用方法
return HttpResponse()
return render()
return redirect()
return JsonRepsonse()
  • 2、设置cookie需要变形
obj = HttpResponse()
obj.操作cookie的方法
return obj


obj = render()
obj.操作cookie的方法
return obj

obj = redirect()
obj.操作cookie的方法
return obj

obj = JsonRepsonse()
obj.操作cookie的方法
return obj

# 示例:
def set_cookie(request):
    obj = HttpResponse()
    obj.set_cookie('name','make')  # cookie数据会保存在浏览器
    return obj
  • 3、登录设置cookie
    • (1)、dedault:默认值
    • (2)、salt:加密盐
    • (3)、max_age:后台控制过期时间 单位为秒
    • (4)、保存cookie数据:obj.set_cookie()
    • (5)、拿取cookie数据:request.COOKIES.get()
# 保存cookie数据
def set_cookie(request):
    obj = HttpResponse('中秋快乐')
    # 让浏览器保存cookie数据
    obj.set_cookie('name', 'make')
    return obj

#login视图
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'make' and password == '123':
             obj.set_cookie('name', 'make', max_age=3)  #  参数max_age 为cookie保存信息时间长短。以秒为单位。
             return obj
    return  render(request, 'login.html')

#home视图
def home(request):
    if request.COOKIES.get('name'):  # 取cookie数据
    return HttpResponse('home页面 只有登录的用户才可以查看')
return redirect('/login/')

#首页视图
def index(request):
    if request.COOKIES.get('name'):  # 取cookie数据
    return HttpResponse('index页面 只有登录的用户才可以查看')
return redirect('/login/') 



  • 问题: 上述代码虽然可以实现 登录后保存cookie然后访问其他页面

  • 弊端:网页如果加多 代码也要增加 显得臃肿 而且对后期网页登录访问修改都留下弊端 所以要想办法进行精简

  • 思考:

  • 需求:实现用户在使用客户端浏览器时 只要登录过保存cookie就可以访问该网址的随意页面 并且在需要短期内访问无需要再次验证信息

    • (1)登录设置cookie
    • (2)多个视图函数都需要校验用户是否登录 (装饰器)
    • (3)如何记住用户登录之前想要访问的页面 用户登录之后自动跳转
    • (4)需要用到cookie中的操作方法
    # 方式:
    	print(request.path)  # 获取路由网址后缀
        print(request.path_info)  # 获取路由网址后缀
        print(request.get_full_path())  # 获取网址所有全部的后缀
    
    # 注意:一般使用后两种方式来获取用户想要访问网站页面的全部网址后缀 
    
# 分析:
	情况1:用户访问了其他需要登录才可以访问的页面
    	  如何跳转>>>:想要访问的页面

            
def set_cookie(request):
    obj = HttpResponse('中秋快乐')
    # 让浏览器保存cookie数据
    obj.set_cookie('name', 'make')
    return obj


def login_auth(func_name):
    def inner(request, *args, **kwargs):
        if request.COOKIES.get('name'):
            res = func_name(request, *args, **kwargs)
            return res
        else:
            target_path = request.path_info
            return redirect(f'/login/?next={target_path}')

    return inner


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'make' and password == '123':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)  # 如果有值则跳转到指定页面
            else:
                obj = redirect('/home/')  # 如果没有值则跳转到首页
            obj.set_cookie('name', 'make', max_age=3)
            return obj
    return render(request, 'login.html')


@login_auth
def home(request):
    return HttpResponse('home页面 只有登录的用户才可以查看')


@login_auth
def index(request):
    return HttpResponse('index页面 只有登录的用户才可以查看')

# 分析:
	情况2:用户直接访问登录页面
    	  如何跳转>>>:网址首页
            

      
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'make' and password == '123':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)  # 如果有值则跳转到指定页面
            else:
                obj = redirect('/home/')  # 如果没有值则跳转到首页
            obj.set_cookie('name', 'make', max_age=3)
            return obj
    return render(request, 'login.html')


Django操作session

  • 1.设置djanjo操作sessionsession保存用户信息需要一张表(django_session 表) 需要提前执行数据库迁移命令,会自动创建django_session 表这张表就是专门用来存储session相关服务端的数据,因此想要执行session,必须先执行迁移命令

  • 2.django默认的session失效时间14天

  • 3.客户端会接收到键值对 键默认是sessionid值是加密的随机字符串(令牌)

  • 4、设置session

request.session['name'] = 'jason'
	1.django自动产生一个随机字符串返回给客户端(对name加密)
	2.往django_session创建数据(对jason加密)

def set_session(request):
    request.session['name'] = 'jason'
    return HttpResponse('设置session')
===========================================================================


request.session.get('name')
	1.自动从请求中回去sessionid对应的随机字符串
	2.拿着随机字符串去django_session中匹配数据
	3.如果匹配上还会自动解密数据并展示

def get_session(request):
    print(request.session.get('name'))
    return HttpResponse('获取session')
  • 5、5中类型的session
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

5. 加密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,默认修改之后才保存(默认)
Django中Session相关设置


Django中间件

  • 简介:django中间件类似于django的门户 所有的请求来和响应走都必须经过中间件(它是一个轻量、低级别的插件系统 用于在全局范围内改变Django的输入和输出 每个中间件组件都负责做一些特定的功能。)
  • 1、django默认自带七个中间件,每个中间件都有各自负责的功能
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]


  • 2、django中间件除了默认的之外 还支持自定义中间件(无限加中间件)

  • 3、中间件使用场景

    • 全局相关的功能:全局用户身份校验,全局用户黑名单校验,全局用户访问频率校验
  • 4、django自定义中间件中有五种方法

process_request
process_response
process_view
process_template_response
process_exception
方法 说明
process_request 1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
process_response 1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
process_view(了解) 当路由匹配成功之后 执行视图函数之前 自动触发
process_excption(了解) 当视图函数报错之后 自动触发
process_template_response(了解) 当视图函数返回的数据对象中含有render属性对应render函数才会触发

注意:如果请求的过程中process_request方法直接返回了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)

  • 5、定义中间件步骤
    • 1.如果想要写一些第三方的插件功能,可以在应用下创建一个文件,在这个文件下写一些py文件

  • 2、配置中间件

  • 3、process_request
1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
  • 4、process_response
1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
ps:如果请求的过程中process_request方法直接反悔了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)

标签:return,中间件,request,Django,session,cookie,obj
来源: https://www.cnblogs.com/55wym/p/16687611.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有