Cookie与Session

Cookie与session简介

 1.Cookie简介
  1.1.Cookie的由来:
   由于请求是基于HTTP协议(四大特性 基于请求响应 基于TCP、IP协议作用于应用层之上 无状态 无连接)
   所以对于服务器来说 每一次的请求都是全新的 但是实际应用中需要保存产生的数据 需要"保存状态"
  1.2.Cookie:具体指的是一段小信息 它是服务器发送出来存储在浏览器上的一组组键值对 下次访问服务器 浏览器会自带这些信息 以便服务器提取有用信息
  1.3.Cookie原理:由服务器产生内容 浏览器收到请求后保存本地 当浏览器再次访问时 浏览器会自动带上Cookie 这样服务器就可以通过Cookie的内容判断是谁
 2.Session简介
  2.1 Session的由来:由于Cookie以文本的形式保存在本地 自身安全性较差 且保存的字节数有限制(最大是4096字节) 所以针对私密信息及超过4096字节的文本数据可以通过Session保存在服务器上

django操作cookie

 1.获取Cookie

  request.COOKIES['key']
  request.get_cookie(key,default=RAISE_ERROR, salt='', max_age=None)
  参数:default   默认值
        salt     加密盐
        max_age  后台控制过期时间

 2.设置Cookie

  2.1 让客户端浏览器保存cookie需要HttpResponse对象调用方法
      return HttpResponse()
      return rander()
      return redirect()
      return JsonReponse()
   2.2 设置cookie(需要变形)
       obj = HttpResponse()
       obj.操作cookie的方法(2.1的方法)
       return obj
	
       obj = render()
       obj.操作cookie的方法
       return obj
     
       obj = redirect()
       obj.操作cookie的方法
       return obj

 3.利用cookie实现网站网页用户登录系统校验

  3.1 设置路由(用户登录界面/网站首页/网站商城)
  3.2 创建核心逻辑代码
      创建用户登录及查看页面(html页面 可以先设置一个登录界面 其余用返回HttpResponse字符串代替)
      用户登录获取用户输入的用户名及密码(request.POST.get()获取)
      通过cookie保存(obj.set_cookie('name', 'lili')可以多个set_cookie保存信息 至浏览器cookie中(检查-Application查看 以K:v键值对的形式存储)
      网站其余页面均需登录后才可以访问(涉及用户登录校验装饰器)
      在执行想要访问的页面前判断用户是否登录(通过cookie获取用户登录存储在浏览器上的信息(request.COOKIE.get('name'))) 如果有信息访问 没有跳转至登录界面登录(cookie相当于以前记录是否登录的全局变量)
      获取用户想要访问的页面网址后缀 没有登录访问页面时在登录页面的网址后置后面添加想要访问的网址后置(return redirect(f'/login/?next={login_path}')) 给其他页面装上装饰器
      request.path  (获取后缀)
      request.path_info  (获取后缀)
      request.path_full_path()   (还可以获取后缀后面的数据信息)
      在登录函数中在判断用户名与密码一致后 判断是否存在用户想要访问的网址后缀
      如果有 登录后redirect重定向至访问页面
      如果没有 登录后redirect重定向至网页首页

 4.代码操作

  路由层代码:
    urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
    path('home/', views.home),
    path('index/', views.index)
]   
 视图层代码:
   def user_login(func_name):
    def inner(request, *args, **kwargs):
        # if args[0].COOKIES.get('name'):
        if request.COOKIES.get('name'):
            res = func_name(request, *args, **kwargs)
            return res
        else:
            # 获取用户想要访问的网址后缀
            login_path = request.get_full_path()
            return redirect(f'/login/?next={login_path}')
    return inner


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'lili' and password == '12345':
            # 判断是否存在用户想要访问的页面
            target_path = request.GET.get('next')    # get请求获取
            # 如果有登录后跳转至该页面
            if target_path:
                obj = redirect(target_path)
            # 如果没有跳转至首页
            else:
                obj = redirect('/home/')
            obj.set_cookie('name', 'lili')
            return obj
    return render(request, 'login.html')


# 登录后才可以访问
@user_login
def home(request):
    # if request.POST.get('home'):
        return HttpResponse('网站首页')
    # else:
    #     return redirect('/login/')


# 登录后才可以访问
@user_login
def index(request):
    # if request.COOKIES.get('name'):
        return HttpResponse('商品页面')
    # else:
    #     return redirect('/login/')              
模板层代码:
              <form action="" method="post">
                <p>用户名:
                    <input type="text" name="username"></p>
                <p>密码:
                    <input type="password" name="password"></p>
                <p><input type="submit" name="登录"></p>
            </form>
        </div>

django操作session

 1.获取session:session依赖于cookie cookie保存至浏览器上 session保存至服务器端

  request.session['key']
  django默认的session失效时间是14天
  客户端会接收到键值对 键默认是sessionid值是加密的随机字符串(令牌)
   request.session['name'] = 'lili'
   django自动产生一个随机字符串返回给客户端(对name加密)
   往django_session创建数据(对lili加密) 
   自动从请求中获取sessionid对应的随机字符串(request.session.get('name') 获取)
   用随机字符串去django_session中匹配数据 匹配上自动解密并展示

 2.session的存储位置

  2.1 数据库Session
  2.2 缓存session
  2.3 文件session
  2.4 缓存+数据库
  2.5 加密cookie session

 3.session的其他操作

  3.1 删除当前会话的所有Session数据
      request.session.delect()
  3.2 删除当前的会话数据并删除会话的Cookie
      request.session.flush()
  3.3 设置会话Session与Cookie的超时时间
      request.session.set_expiry(value)
      如果value是个整数 session会在秒数后失效
      如果value是datatime或timedelta,session就会在这个时间后失效
      如果value是0,用户关闭浏览器session就会失效
      如果value是None,session会依赖全局session失效

 4.利用session实现网站网页用户登录系统校验

  路由层代码:
    urlpatterns = [
    path('admin/', admin.site.urls),
    path('session_login/', views.session_login),
    path('session_home/', views.session_home),
    path('session_index/', views.session_index),
    path('session_delete/', views.session_delete)
]
 视图层代码:
def session_user_login(func_name):
    def inner(request, *args, **kwargs):
        if request.session.get('name'):
            res = func_name(request, *args, **kwargs)
            return res
        else:
            login_path = request.get_full_path()
            return redirect(f'/session_login/?next={login_path}')
    return inner


def session_login(request):
    if request.method == 'POST':
        # 获取用户输入的信息
        name = request.POST.get('username')
        pwd = request.POST.get('password')
        print(name)
        print(pwd)
        # 判断用户名及密码是否正确
        if name == 'lili' and pwd == '123':
            # 设置session
            request.session['name'] = 'lili'
            # 判断用户想要访问的页面
            target_path = request.GET.get('next')  # get请求获取
            print(target_path)
            # 如果有登录后跳转至该页面
            if target_path:
                return redirect(target_path)
            # 如果没有跳转至首页
            else:
                return redirect('/session_home/')
    # return HttpResponse('123')
    return render(request, 'session_login.html')


@session_user_login
def session_delete(request):
    # 每次请求前删除session记录
    request.session.delete()
    return redirect('/session_login/')


@session_user_login
def session_home(request):
    return HttpResponse('首页页面')


@session_user_login
def session_index(request):
    return HttpResponse('商品页面')
模板层代码:
<form action="" method="post">
    <p>用户名:
        <input type="text" name="username">
    </p>
    <p>密码:
        <input type="password" name="password">
    </p>
    <p>
        <input type="submit" name="登录">
    </p>
</form>

django中间件

django中间件简介

 1.中间件:所有的请求和响应都必须经过 中间件
 2.django默认自带七个中间件 每个中间件都有各自的职责和功能
 3.中间件设置:除了默认的之外 还可以自定义中间件(没有数量限制)
 4.应用场景:全局相关功能
       全局用户身份校验
       全局用户黑名单校验
       全局用户访问频率校验(爬虫场景)
 5.django自定义中间件五个方法:

   process_request
   process_response
   process_view
   process_template_response
   process_exception

django中间件方法

 1.自定义中间件:
  settings中在中间件配置中配置
  路由中进行路由匹配
  创建一个py文件进行中间件创建(模仿)
 2.process_request方法
  2.1 请求来的时候会按照配置文件中注册的中间件 从上往下依次执行每一个中间件里的process_request方法 没有则跳过
  2.2 该方法如果返回HttpResponse对象 那么请求不会再往后执行 直接原路返回
 3.process_response方法
  3.1 响应走的时候会按照配置文件中注册的中间件 从下往上一次执行每一个中间件里的process_response方法 没有则跳过
  3.2 该方法有两个形参request和response 并且默认情况下应该返回response
  3.3 该方法也可以返回HttpResponse对象
  注:如果请求的过程中process_request方法直接返回了HttpResponse对象那么会原地执行同级别的process_request方法返回(flask不同)
 4.process_view方法
  当路由匹配成功之后 执行视图函数之前 自动触发
 5.process_excption方法
  当视图函数报错之后 自动触发
 6.process_template_response方法
  当视图函数返回的数据对象中含有render属性对应的render函数才会触发

作业

1.基于django中间件尝试编写黑名单、白名单功能(url)
  路由层:
    urlpatterns = [
    path('mymiddl/', views.mymiddl),
    path('midd_home/', views.midd_home)
]
  视图层:
  def mymiddl(request):
    return render(request, 'mymiddl.html')

    def midd_home(request):
        return HttpResponse('vip页面')
   自定义中间件:
	from django.utils.deprecation import MiddlewareMixin
	from django.shortcuts import HttpResponse, redirect

    class MyDdl(MiddlewareMixin):

        def process_request(self, request):
            if request.method == 'POST':
                name = request.POST.get('username')
                if name == 'lili':
                    return HttpResponse('不好意思 你是黑名单人员')

        class MyDdl1(MiddlewareMixin):

            def process_request(self, request):
                if request.method == 'POST':
                    name = request.POST.get('username')
                    pwd = request.POST.get('password')
                    if name == 'tom' and pwd == '123':
                        return redirect('/midd_home/')
    模板层:
          <form action="" method="post">
                <p>用户名:
                    <input type="text" name="username"></p>
                <p>密码:
                    <input type="password" name="password">
                </p>
                <p>
                    <input type="submit" value="登录">
                </p>
        	</form>
 posted on 2022-09-12 22:07  拾荒菇凉  阅读(141)  评论(0)    收藏  举报