• cookie与session


    • 基本实现用户登录

    • 用户未登录就不能访问指定页面

      • 基于cookie实现

      • def login(request):
        	# return HttpResponse('...')
        	# return render('...')
        	# return redirect('...')
        	# 设置cookie
        	data = redirect('...')
        	data.set_cookie()
        	# 读取cookie
        	request.COOKIES.get('xx')
        	return data
        
      • 
        def login(request):
            """
            用户登录
            :param request:
            :return:
            """
            if request.method == "GET":
                return render(request, "login.html")
        
            # 获取用户提交的用户名和密码
            user = request.POST.get("username")
            pawd = request.POST.get("password")
        
            # 去数据库检查用户名和密码是否正确
            user_obj = models.UserInfo.objects.filter(username=user, password=pawd).first()
            #  user_obj = models.UserInfo.objects.filter(username=user, password=pawd).exists()
            if user_obj:
                # 用户登录成功
                result = redirect('/index/')
                result.set_cookie('username', user)
                return result
            return render(request, "login.html", {'error': '用户名和密码错误'})
        
        
        def index(request):
            """
            博客园后台首页
            :param request:
            :return:
            """
            user = request.COOKIES.get('username')
            if not user:
                return redirect('/login/')
            return render(request, 'index.html', {"user": user})
        
    • 应用场景

      • 用户认证
      • 投票
      • 每页默认显示

    cookie操作

    • 通过js设置cookie

      • 两种方式
        document.cookie = 'k1=wy222;path=/'
        
        $.cookie('k1','wy222',{path:'/'})
        
        注意:path不同会导致设置不同.
        
    • path的作用

      • / , 当前网站中所有的URL都能读取到此值.
      • "",只能在当前页面访问的到此数据.
      • /index/ ,只能在/index/xxx 的网页中查看

    操作session

    • 设置:即添加
      • request.session[user_name] = ‘david’
    • 读取:
      • request.session[‘user_name’]

    ​ request.session.get(‘user_name’)

    • 删除

      • del request.session[user_name]
    • 字典操作

      • request.session.values()
      • request.session.keys()
      • request.session.items()
    • 设置过期时间

      • request.session.set_expiry(999)
    • 获取当前随机字符串

      • request.session.session_key

    session

    • 是一种存储数据 的方式,依赖于cookie,实现本质

    • 用户向服务端发送请求,服务端做两件事

      • 生成随机字符串,
      • 为次用户开辟一个独立的空间来存放用户当前独有的值
        • 在空间中设置值:
          • request.session[‘user_name’] = ‘david’
        • 在空间中取值:
          • request.session[‘user_name’]
          • request.session.get(‘user_name’)
    • 视图函数中的业务处理完毕,给用户响应,在响应时会将随机字符串储存到用户浏览器的cookie中

    • 应用场景:

      • 用户认证
      • 短信验证过期
      • 权限管理
    • 强调:

      • session中默认储存的数据根据用户相互隔离

    session用户登录认证

    • 首先引入装饰器

      • 装饰器要加入functools.wraps装饰:保留函数的元数据(函数名/注释)

      • import functools
        def wrapper(func):
        	@functools.wraps
        	def inner(request, *args, **kwargs):
        		user = request.session.get('user_name')
        		if not user:
        			return redirect('/login/')
        		return func(request, *args, **kwargs)
        	return inner
        

    两者的区别

    • cookie是存储在浏览器上的键值对,发送请求时浏览器会自动携带
    • session时一种存储数据的方式,基于cookie实现,将数据存储在服务端,django默认存储到数据库,其本质是:
      • 用户向服务端发送请求,服务端做两件事
        • 生成随机字符串,
        • 为次用户开辟一个独立的空间来存放用户当前独有的值
          • 在空间中设置值:
            • request.session[‘user_name’] = ‘david’
          • 在空间中取值:
            • request.session[‘user_name’]
            • request.session.get(‘user_name’)
      • 视图函数中的业务处理完毕,给用户响应,在响应时会将随机字符串储存到用户浏览器的cookie中

    扩展

    • django的session的默认储存在数据库,可以储存在其他地方吗

      • 文件中,None可以指定文件路径

        • SESSION_ENGINE = ‘django.contrib.sessions.backends.file’
          
          SESSION_FILE_PATH = ‘None’
          
      • 缓存(内存)

        • SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
          SESSION_CACHE_ALIAS = 'default'
          
          CACHES = {
              'default': {
                  'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
                  'LOCATION': 'unique-snowflake',
              }
          }
          
      • 缓存(redis)

        • SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
          SESSION_CACHE_ALIAS = 'default'
          CACHES = {
              "default": {
                  "BACKEND": "django_redis.cache.RedisCache",
                  "LOCATION": "redis://127.0.0.1:6379",
                  "OPTIONS": {
                      "CLIENT_CLASS": "django_redis.client.DefaultClient",
                      "CONNECTION_POOL_KWARGS": {"max_connections": 100}
                      # "PASSWORD": "密码",
                  }
              }
          }
          
      • 总结:

        • 小系统:默认数据库就可以
        • 大系统:缓存redis
    • django中的session如何设置过期时间

      • SESSION_COOKIE_AGE = 1209600 # Session的
        cookie失效日期(2周)
        

    SESSION设置文件解读

    • SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
      
      SESSION_COOKIE_DOMAIN = None  # api.baidu.com /www.baidu.com/ xxx.baidu.com
      
      SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径
      
      SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输,即能否修改cookie
      
      SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)
      
      SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
      

    总结

    • orm字段中的verbose_name
      • 目前当注释用
      • 以后:在model form 和form中使用
    • 路由系统中记得加入终止符$:
      • 防止url被截胡
    • 用户名或密码检测:
      • xxxx.first() #返回对象或None
      • xxxx.exists() #返回布尔值
    • 模板查找顺序
      • 根目录templates
      • 然后app注册顺序去每个app的templates中查找
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    遍历指定目录及其子目录下所有文件
    vim 配置
    解决 Mendeley Linux 中文输入问题
    全角半角字符对照表
    chrome 替换多线程下载管理器
    查看系统日志
    中大东校区iNode For linux 配置笔记
    anaconda 虚拟环境笔记
    linux 网络操作
    deepin 装机
  • 原文地址:https://www.cnblogs.com/daviddd/p/12051329.html
Copyright © 2020-2023  润新知