• python 第六十二章 Django cookie和session


    一、知识回顾

    1.装饰器

    def wrapper(f):
    	def inner(*args,**kwargs):# 可以传参数的
    		ret = f(*args,**kwargs)
    		return ret
    	return inner
    	
    

    2.升级版装饰器

    import functools
    def wrapper(f):
      @functools.wraps(f)
      def inner(*args,**kwargs):
        return f(*args.**kwargs)
      return inner
    '''
    1、执行wrapper
    2、重新赋值
    index = wrapper(index)
    '''
    @wrapper
    def index(a1,a2):
      '''
      这是一个index函数
      '''
    	return a1+a2
    
    print(index.__name__)# 得到函数名
    print(index.__doc__)# 得到相关文档
    

    3、什么是http 协议

    1.定义是:一种超文本传输协议
    2.特点是:一次请求一次响应之后断开连接(无状态,无连接)
    3.格式是:
    请求:请求头+请求体(http:www.baidu.com/index/?a=123)
    send('GET/index/?a=123http1.1
    hose:www.baidu.com
    user-agent:Chrome
    
    ')
         
    send('post /index/http1.1
    host:www.baidu.com
    user-agent:Chrome
    
    username=alex&pwd=123')
    
    响应:响应头+响应体
    Content-Encoding:gzip
    Cache-Control:private
    
     网页看到的HTML内容
    
    常见的请求头:
    -user-agent:用什么浏览器访问的网站
    -content-type:请求体的数据格式是什么?(服务端按照格式要求进行解析)
    
    常见的请求方式:
    -GET
    -POST
    

    4.Django的请求生命周期

    浏览器上输入http://www.xx.com 请求到达Django后发生了什么?

    image-20191008202457535

    1、当浏览器输入URL网址的时候,会生成请求头和请求体发送给服务端,请求头和请求体一般会包含浏览器的动作,一般是GET和PSOT

    2、URL经过Django的wsgi协议websocket通信(线上改成uwsgi),在路由系统中一条条进行匹配,匹配成功后执行视图函数

    3、再执行ORM数据库,数据库在Django的外面,再把数据传给ORM

    4、再传给视图,视图把数据传给模版,模版进行加工渲染,5、最后返回给视图,视图再返回给websocket通信,给客户端展示

    image-20191009113259860

    5、博客系统

    • 基本实现用户登录

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

      • 基于cookie实现

      • 保存在用户浏览器端的键值对,向服务端请求时会自动携带
        cookie 可以用于记录用户的登录状态,还可以记录一天的刷票数据和购物车记录
        
      • 基于session实现(推荐)

        依赖cookie
        是一种存储数据的方式,依赖于cookie,实现本质:
        用户向服务端发送请求,服务端做两件事情:
        1.生成随机字符串;
        2.为此用户开辟了一个独立的空间来存放当前用户独有的值
        
        在空间中如何想要设置值:
        request.session['x1'] = 123
        request.session['x2'] = 456
        
        在空间中取值:
        request.session['x2']
        request.session.get('x2')
        
        视图函数中的业务操作处理完毕,给用户响应,在响应时会将随机字符串存储到用户浏览器的cookie中
        
      • cookie和session的区别

      • cookie是存储在客户端浏览器上的键值对,发送请求时浏览器会自动携带
        session是一种存储数据方式,基于cookie实现,将诗句存储在服务端(Django默认存储到数据库),本质是:
        用户向服务端发送请求,服务端做两件事情,生成随机字符串,为此用户开辟一个独立的空间来存放当前用户独有的值。
        
        在空间中如何想要设置值:
        request.session['x1']=123
        request.session['x2']=456
        在空间中取值:
        request.session['x2']
        request.session.get('x2')
        
        视图函数中的业务操作处理完毕,给用户响应,在相应时会将随机字符串存储到用户浏览器的cookie中
        

    6、Django和session的相关配置

    SESSION_COOKIE_NAME = 'sessionid'# sessionde 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 # 是否只支持http传输
    
    SESSION_COOKIE_AGE = 1209600 # cookie 默认两周后实效
    
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
    
    SESSION_SAVE_EVERY_REQUEST = False # 是否每 次请求都保存Session,默认修改之后才保存
    
    • django中的session如何设置过期时间?

      SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)
      
    • django的session默认存储在数据库,可以放在其他地方
      吗?

      小系统:默认放在数据库即可. 大系统:缓存(redis)
      
    • 文件

    • SESSION_ENGINE =
      'django.contrib.sessions.backends.file'
      SESSION_FILE_PATH = '/sssss/'
      
    • 缓存(内存)

    • SESSION_ENGINE =
      'django.contrib.sessions.backends.cache'
      SESSION_CACHE_ALIAS = 'default'
      CACHES = {
          'default': {
              'BACKEND':
      'django.core.cache.backends.locmem.LocMem
      Cache',
              '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": "密码", 
               }
      		} 
      } 
      
    • 操作session

      # 设置(添加&修改) request.session['x1'] = 123 request.session['x2'] = 456
      # 读取 request.session['xx'] request.session.get('xx')
      # 删除
      del request.session['xx']
      request.session.keys()
      request.session.values()
      request.session.items()
      request.session.set_expiry(value)
      request.session.session_key
      
  • 相关阅读:
    AI智能检测识别EasyCVR视频融合平台告警抓拍图片的逻辑优化
    状态压缩子集枚举2305. 公平分发饼干
    滑动窗口区间长度最大值6169. 最长优雅子数组
    数学丑数系列
    模拟6170. 会议室 III
    状态压缩1595. 连通两组点的最小成本
    优先队列2386. 找出数组的第 K 大和
    优先队列多路归并系列题解
    滑动窗口解题技巧
    状态压缩1434. 每个人戴不同帽子的方案数
  • 原文地址:https://www.cnblogs.com/zhangshan33/p/11644341.html
Copyright © 2020-2023  润新知