django框架-9

Cookie的由来?

说到这就不得不提HTTP协议~~~

HTTP协议四大特性
    1.基于请求响应
    2.基于TCP、IP作用于应用层之上协议    
    3.无状态
        服务端无法识别客户端的状态
            1.互联网刚开始兴起的的时候 所有人访问网址都是一样的数据
                服务端无法识别客户端问题不大
            2.互联网发展 淘宝、京东、阿里
                服务端不得不想办法记住客户端的状态   因此Cookie与Session就是在这样一个场景下诞生
    4.无连接

什么是Cookie

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

Cookie的原理

cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了

什么是Session

保存在服务端上跟用户信息(状态)相关的数据

Session的工作流程

session的工作需要依赖于cookie 就算是目前所有能够识别用户身份的网址也都需要使用cookie(客户端浏览器也有权拒绝保存cookie)

django操作cookie

参数

  • default: 默认值
  • salt: 加密盐
  • max_age: 后台控制过期时间(以秒为单位)

cookie操作

  • obj.set_cookie()         # 设置
  • obj.COOKIE.get()       # 获取
  • 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 == 'curry' and password == '666':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)  # 如果有值 则跳转到指定页面
            else:
                obj = redirect('/home/')  # 如果没有值 则跳转到首页
            obj.set_cookie('name', 'curryZZZ')
            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页面 只有登录的用户才可以查看')

 session操作

设置session request.session['key'] = value
    1.django自动产生一个随机字符串返回给客户端(对name加密)
    2.往django_session表中创建数据(对jason加密)
    3.sessionid:随机字符串
获取session 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)  # 设置超时时间

1.如果value是个整数,session会在些秒数后失效。
2.如果value是个datatime或timedelta,session就会在这个时间后失效。
3.如果value是0,用户关闭浏览器session就会失效。
4.如果value是None,session会依赖全局session失效策略

django中默认支持Session,其内部提供了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'   # 引擎

django中间件

什么是django中间件?

Django中间件相当于Django得门户:
1.请求来的时候需要先经过中间件才能到达真正的django后端
	(浏览器给后端发送请求必须经过中间件)
2.响应走的时候最后也需要经过中间件才能发送出去
	(后端给浏览器返回数据的时候也需要经过中间件)
 
Django自带7个中间件(在settings里)
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_request(self, request):
    print('from MyMdd1 process_request')
    return HttpResponse('from MyMdd1 process_request')
1.请求来的时候会按照配置文件中注册了的中间件从上往下依次执行每一个中间件里面process_request方法、如果没有则直接跳过
2.如果该方法自己返回了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方法

 

posted @ 2022-09-13 15:54  初学者-11  阅读(26)  评论(0编辑  收藏  举报