ICode9

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

django学习笔记day09

2022-09-09 20:04:34  阅读:245  来源: 互联网

标签:day09 process 中间件 request 笔记 django session response


今日内容概要

  • cookie与session
  • django中间件

今日内容详细

cookie与session

简介

回顾知识:

HTTP四大特性:
1.基于请求响应
2.基于TCP、IP作用于应用层之上协议
3.无状态:服务端无法识别客户端的状态
4.无连接

Cookie

互联网刚兴起的时候,所有人访问网址都是一样的数据,服务端无法识别客户端问题不大,经过互联网的发展服务端不得不想办法记住客户端的状态,cookie与session就应运而生了。

cookie就是保存在客户端上跟用户信息(状态)相关的数据。它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

工作原理:
让服务端知道你是谁的方式很单一>>>:携带用户名和密码(身份标识)
每次操作之前都需要输入用户名和密码
当你成功登录之后浏览器会在本地帮你保存用户名和密码
后面每次操作浏览器会自动发送用户名和密码

'''简单的记忆:cookie就是存在客户端上跟用户信息(状态)相关的数据'''

Session

Cookie本身保存在客户端,可能被拦截或窃取,不安全。因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。本质就是保存在服务端上跟用户信息(状态)相关的数据。

工作原理:
用户登录成功之后服务端生成一个随机字符串返回给客户端保存
之后客户端每次发请求携带该随机字符串服务端获取之后比对后台数据
eg:
    服务端
        随机字符串1    用户数据1
        随机字符串2    用户数据2
        随机字符串3    用户数据3
    客户端
        随机字符串1、随机字符串2、随机字符串3

'''简单的记忆:session就是存在服务端上跟用户信息(状态)相关的数据'''

注意:

1.session的工作需要依赖于cookie、就算是目前所有能够识别用户身份的网址也都需要使用cookie

2.客户端浏览器也有权拒绝保存cookie

django操作cookie

视图函数返回值都是需要一个HttpResonse,我们想要操作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

基本使用

obj.set_cookie()  # 设置
obj.COOKIE.get()  # 获取

cookie其他操作

set_cookie(key,value,salt='加密盐')  # 加密盐
# 会在value后面产生一个随机字符串eg:1ntTFz:bFkwr34ztzsHQLU1qYp

set_cookie(key,value,max_age=超时时间:默认是秒数)  # 后台控制过期时间
# expires:专门针对IE浏览器设置超时时间

# 删除Cookie
# HttpResponse对象.delete_cookie(key) 
def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
    return rep

实例:登录功能

1.登录设置cookie
2.多个视图函数都需要校验用户是否登录
    装饰器
3.如何记住用户登录之前想要访问的页面 用户登录成功之后自动跳转
    场景1:用户访问了其他需要登录才可以访问的页面   如何跳转>>>:想要访问的
    场景2:用户直接访问的登录页面  如何跳转>>>:网址首页

request.path  # 只能获取路由后缀
request.path_info  # 只能获取路由后缀
request.get_full_path()  # 不仅能获取路由后缀,还能获取后缀问号后面的数据

# 登录校验装饰器
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 == 'jason' and password == '123':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)  # 如果有值则跳转到指定页面
            else:
                obj = redirect('/home/')  # 如果没有值则跳转到首页
            obj.set_cookie('name', 'jasonNB')
            return obj
    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页面 只有登录的用户才可以查看')

django操作session

请求来之后服务端产生随机字符串并发送给客户端保存、服务端存储随机字符串与用户信息的对应关系、之后客户端携带随机字符串 、服务端自动校验。

针对保存 django需要一张表来处理:django_session表,即django数据库迁移命令会产生一堆默认的表,其中就有一张django_session表、里面只有三个字段(session_keysession_dataexpire_date)。

设置

request.session['key'] = value  # 可以设置多组

1.django自动产生一个随机字符串返回给客户端(对name加密)
2.往django_session表中创建数据(对jason加密)
3.sessionid:随机字符串

获取

request.session.get('key')  # 可以获取多组

1.自动从请求中获取sessionid对应的随机字符串
2.拿着随机字符串去django__session表中匹配数据
3.如果匹配上还会自动解密数据并展示

注意:

1.django默认的session失效时间是14天

2.客户端会接受到键值对,键默认是sessionid值是加密的随机字符串

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. 数据库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'   # 引擎

django中间件

官方说法:中间件是一个用来处理django的请求和响应的框架级别的钩子。说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,他本质上就是一个自定义类,类中定义了几个方法,django框架会在请求的特定的时间去执行这些方法。

django中间件类似于django的门户、所有的请求来和响应走都必须经过中间件。

django默认自带七个中间件每个中间件都有各自负责的功能、我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下面的MIDDLEWARE配置项。

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',
]

django中间件的使用场景:只要是与全局相关的功能都可以在中间件中编写。

eg:全局用户身份校验、全局用户黑名单校验、全局用户访问频率校验。

自定义中间件

django支持自定义中间件可以有5个方法。

process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)

基本使用

  1. 创建一个任意名称的文件夹
  2. 在该文件夹内创建一个任意名称的py文件
  3. 在该py文件内编写中间件类
  4. 配置文件中注册
# 步骤二创建的py文件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect,render

class MyMdd1(MiddlewareMixin):
    def process_request(self, request):
        print('from MyMdd1 process_request')

    def process_response(self, request, response):
        print('from MyMdd1 process_response')
        return response  # response就是视图函数返回给客户端的数据

# settings.py
MIDDLEWARE = [
    # 注册自定义中间件
    'app01.mymiddleware.mymdd.MyMdd1',
    'app01.mymiddleware.mymdd.MyMdd2',
]

需要掌握的方法

1.process_request

def process_request(self, request):
    print('from MyMdd1 process_request')
    return HttpResponse('from MyMdd1 process_request')
1.请求来的时候会按照配置文件中注册了的中间件从上往下依次执行每一个中间件里面process_request方法、如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象,那么请求不再继续往后执行原路返回相应的数据

2.process_response

def process_response(self, request, response):
    print('from MyMdd1 process_response')
    return response  # response就是视图函数返回给客户端的数据
1.响应走的时候会按照配置文件中注册了的中间件从下往上依次执行每一个中间件里process_response方法、如果没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.如果该方法自己返回了HttpResponse对象,那么响应会替换成该HttpResponse对象数据,而不再是视图函数想要返回给客户端的数据

注意:

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

需要了解的方法

1.process_view

def process_view(self,request,view_func, view_args, view_kwargs):
    # print(view_func)  # 即将要执行的视图函数名
    # print(,view_args)  # 传给视图函数的位置参数
    # print(view_kwargs)  # 传给视图函数的关键字参数
    print('from MyMdd2 process_view')
当路由匹配成功之后执行视图函数之前自动从上往下执行配置文件中注册了的中间件里面的process_view方法

2.process_exception

def process_exception(self,request,exception):
    print(exception)
    print('from MyMdd2 process_exception')
当视图函数执行过程中报错并在返回响应的时候自动从下往上执行配置文件中注册了的中间件里面的process_exception

3.processtemplate_response

def process_template_response(self,request,response):
    print('from MyMdd2 process_template_response')
    return response
当视图函数执行完毕之后返回的对象中含有render属性对应render函数,则会从下往上执行配置文件中注册了的中间件里面的process_template_response方法

标签:day09,process,中间件,request,笔记,django,session,response
来源: https://www.cnblogs.com/wwjjll/p/16673800.html

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

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

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

ICode9版权所有