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中查找
希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
原文地址:https://www.cnblogs.com/daviddd/p/12051329.html