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\r\nhose:www.baidu.com\r\nuser-agent:Chrome\r\n\r\n')
     
send('post /index/http1.1\r\nhost:www.baidu.com\r\nuser-agent:Chrome\r\n\r\nusername=alex&pwd=123')

响应:响应头+响应体
Content-Encoding:gzip\r\nCache-Control:private\r\n\r\n 网页看到的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
    
posted @ 2019-10-09 20:59  张珊33  阅读(200)  评论(0编辑  收藏  举报