Django框架07 /cookie和session

Django框架06 /cookie和session

1.装饰器

def wrapper(f):
    def inner(*args,**kwargs):
        return f(*args,**kwargs)
    return inner
@wrapper 
def index(a1,a2):    
    """    
    这是一个index函数
    """    
    return a1+ a2
print(index.__name__)  
print(index.__doc__)

结果:
inner

        这是一个inner函数
        
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__)

结果:
index

    这是一个index函数
   
作用:保留函数的元数据(函数名/注释)

2.什么是http协议

1.超文本传输协议
2.关于连接:一次请求一次响应之后断开来连接(无状态、短连接)
3.关于格式:
    请求:请求头+请求体(http:www.baidu.com/index/?a=123)
         send("GET /index/?a=123 http1.1\r\nhost:www.baidu.com\r\nuseragent:Chrome\r\n\r\n")
          send("POST /index/ http1.1\r\nhost:www.baidu.com\r\nuseragent:Chrome\r\n\r\nusername=alex&pwd=123") 
     响应:响应头+响应体        
        Content-Encoding: gzip\r\nCache-Control: private\r\n\r\n网页看到的HTML内容
4.扩展:常见的请求头都有哪些?    
    - user-agent:用什么浏览器访问的网站。    
    - content-type: 请求体的数据格式是什么(服务端按照 格式要求进行解析) 
5.扩展:常见的请求方式?    
    - GET    
    - POST          

3.django请求生命周期

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

​ #wsgi、uwsgi:web服务网关接口

4.案例:博客系统

1.基本实现用户登录

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

基于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中. 

拓展

django和session相关的配置

1.SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即: sessionid=随机字符串

2.SESSION_COOKIE_DOMAIN = None  # api.baidu.com /www.baidu.com/ xxx.baidu.com

3.SESSION_COOKIE_PATH = "/"  # Session的cookie 保存的路径

4.SESSION_COOKIE_HTTPONLY = True  # 是否 Session的cookie只支持http传输

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

6.SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期

7.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

5.内容总结

  1. 装饰器要加入functools.wrap装饰

    保留函数的元数据(函数名/注释)
  2. orm字段中的verbose_name

    目前当注释用. 
    以后:在model form和form中使用.
  3. 路由系统中记得加入终止符 $

  4. 用户名和密码检测

    xxxx.first() # 返回对象或None 
    xxxx.exists()  # 返回布尔值
    
  5. 模板查找顺序

      根目录templates 
      根据app注册顺序去每个app的tempaltes中找
    
  6. cookie

  • 原理

  • 操作

    def login(request):
      # return HttpResponse('...')
        # return render('...')
        # return redirect('...')
        # 设置cookie
        data = redirect('...')
        data.set_cookie()
        # 读取cookie
        request.COOKIES.get('xx')
        return data
    必须背会一下三个参数:
        key, value='', max_age=None
    
  • 应用场景:

    用户认证

    投票

    每页默认显示数据

  1. session

    原理:随机字符串的过程....

操作

  request.session['x'] 
  request.session['x'] = 123 
  del request.session['x']

配置

​ 数据存储位置

​ 数据库(django默认)

​ 文件

​ 缓存(内存/redis)

​ cookie相关操作

应用场景

​ 用户认证

​ 短信验证过期

​ 权限管理

强调

  session中的数据是根据用户相互隔离.
  # 示例 
  def login(request):    
      # 获取用户提交的用户名和密码    
      user = request.POST.get('user')    
      request.session['user_name'] = user     
  def index(request):    
    print(request.session['user_name'])
  1. Http协议

  2. django请求生命周期

  3. 从数据库判断用户名以及密码的两种方式

    # 去数据库检查用户名密码是否正确
    # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()
    # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists()
    

cookie练习代码

from django.shortcuts import render,redirect
from app01 import models

def login(request):
    """
    用户登录
    :param request:
    :return:
    """
    if request.method == 'GET':
        return render(request, 'login.html')

    # 获取用户提交的用户名和密码
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')

    # 去数据库检查用户名密码是否正确
    # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()
    # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists()
    user_object = models.UserInfo.objects.filter(username=user, password=pwd).first()

    if user_object:
        # 用户登录成功
        result = redirect('/index/')
        result.set_cookie('xxxxxxxx',user)
        return result

    # 用户名或密码输入错误
    return render(request,'login.html',{'error':'用户名或密码错误'})


def index(request):
    """
    博客后台首页
    :param request:
    :return:
    """
    user = request.COOKIES.get('xxxxxxxx')
    if not user:
        return redirect('/login/')

    return render(request,'index.html',{'user':user})

session练习代码

from django.shortcuts import render,redirect

from app01 import models

def login(request):
    '''
    用户登陆
    :param request:
    :return:
    '''
    if request.method == 'GET':
        return render(request,'login.html')
    user = request.POST.get('username')
    pwd = request.POST.get('password')
    ret = models.UserInfo.objects.filter(username=user,password=pwd).first()
    if ret:
        request.session['user_name'] = ret.username
        return redirect('/index/')
    return render(request,'login.html',{'error':'用户名或密码错误'})

#构建装饰器
import functools
def auth(f):
    @functools.wraps(f)
    def inner(request,*args,**kwargs):
        user = request.session.get('user_name')
        if not user:
            return redirect('/login/')
        return f(request,*args,**kwargs)
    return inner

@auth
def index(request):
    '''
    博客后台首页
    :param request:
    :return:
    '''
    return render(request,'index.html')

猜你喜欢

转载自www.cnblogs.com/liubing8/p/11643340.html