zoukankan      html  css  js  c++  java
  • 10 Django -- cookie和session

    1. 装饰器

    装饰器中加入funtools.wraps装饰,能够保留函数的元数据(函数名、注释)

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

    2. Django生命周期

    请求进入Django前,有一个WSGI,能够接收请求,并将请求信息封装。

    WSGI(Web Server Gateway Interface)就是一种规范,称为web服务网关接口,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。

    常用服务器:wsgiref/uwsgi ,本质是一个socket服务端。

    过程:

    ​ 客户端发来一个请求,WSGI进行接收,并且将那个请求信息封装,然后经过路由系统进行路由匹配,到达视图views,进行业务逻辑处理,进行相应的orm操作以及模板的渲染。最后通过WSGI发送到客户端。

    ​ 背景:前面学的django,虽然写了很多页面,但是用户不用登陆都是可以看所有网页的,只要他知道网址就行,但是为了自己的安全机制,需要要做验证,访问哪一个网址,都要验证用户的身份,但是还有保证什么呢,用户登陆过之后,还要保证登陆了的用户不需要再重复登陆,就能够访问我网站的其他的网址的页面。但是http无状态啊,怎么保证这个事情呢?此时就要借助cookie了。

    ​ 定义:cookie是浏览器的技术,Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

    ​ cookie的工作原理:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到响应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

    ​ Cookie的覆盖 :如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。

    Django获取cookie

    Ctrl + Shift + del三个键来清除页面缓存和cookie。

    request.COOKIES['key']
    request.COOKIES.get('key')		# 常用
    

    Django设置cookie

    def index(request):
        #data = HttpResponse('字符串')
        #data = redirect('路径')
        data = render(request, 'index.html')
        data.set_cookie('key',values)
        return data
    

    参数:

    key		# 键
    
    value=''	# 值
    
    max_age=None	# 超时时间(失效时间),max_age=20意思是这个cookie20秒后就消失;参数是None ,会延续到浏览器关闭为止。
    
    
    expires=None	# 超时时间,值是一个datetime类型的时间日期对象,到这个日期就失效的意思
    
    path='/'	# Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问;''只能被当前页面访问;'/index/'能被index以及其子路径访问。
    
    domain=None		#Cookie生效的域名
    
    secure=False	# 如果设置为 True ,浏览器将通过HTTPS来回传cookie。
    
    httponly=False 	#只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
    

    通过js设置cookie

    document.cookie='key=yan;path=/'	# js设置
    
    $.cookie('key','yan', {path:'/'})	# jquery设置
    
    注意:path不同会导致设置不同.
    

    Django删除cookie

    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
        return rep
    

    示例:cookie版登陆校验示例:

    views.py文件:

    from django.shortcuts import render, HttpResponse, redirect
    
    # Create your views here.
    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_obj = models.UserInfo.objects.filter(username=user,password=pwd).first()
        
        # 用户登录成功
        if user_obj:
            
            data = redirect('/index/')
            data.set_cookie('xx', user)
            return data
        # 失败
        return render(request, 'login.html', {'error': '用户名或密码错误'})
    
    
    def index(request):
        """
        登录成功后跳转的页面
        :param request:
        :return:
        """
        user = request.COOKIES.get('xx')
        if not user:
            return render(request, 'login.html')
        return render(request, 'index.html', {'user': user}
    

    应用场景

    ​ 用户认证、投票、每页默认显示数据

    4. session

    ​ 背景:Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。

    原理过程:session是一种存储数据的方式,依赖于cookie。实现本质: 用户向服务端发送请求,服务端做两件事:一生成随机字符串;二为此用户开辟一个独立的空间来存放当前用户独有的值。视图函数中的业务操作处理完毕后,给用户响应,在响应时会将随机字符串存储到用户浏览器的cookie中。

    强调:session中的数据是根据用户相互隔离.

    Django设置session值:可以设置多个

    request.session['k1'] = 123        
    request.session['k2'] = 456 
    

    Django取session值

    request.session['k1']        
    request.session.get('k2')		# 常用 
    

    Django删除session值

    #删除值
    del request.session['k1']  #django-session表里面同步删除
    
    request.session.flush()	# 清除session、cookie,多用于退出登录
    

    其他操作

    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    
    # 设置会话Session和Cookie的超时时间,可用于短信验证
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。
    
    # 会话session的key
    session_key = request.session.session_key  获取sessionid的值(随机字符串)
    

    django的session存储位置,配置文件

    默认存放在数据库中

    小系统:默认放在数据库即可。

    大系统:缓存(redis)

    文件:

    SESSION_ENGINE = 'django.contrib.sessions.backends.file'  # 引擎
    SESSION_FILE_PATH = '/文件夹/'
    
    

    缓存(内存)

    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": "密码",}}}
    

    扩展

    django和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传输,js不能修改
    
    SESSION_COOKIE_AGE = 1209600  # Session的 cookie失效日期(默认2周)
    
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
    
    SESSION_SAVE_EVERY_REQUEST = False  # 是否每 次请求都保存Session,默认修改之后才保存
    
    

    django中的session设置过期时间

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

    示例:使用装饰器,减少代码重复。

    views.py文件

    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_obj = models.UserInfo.objects.filter(username=user,password=pwd).first()
    
        # 用户登录成功
        if user_obj:
            request.session['user_name'] = user_obj.username
            request.session['user_id'] = user_object.pk
            return redirect('/index/')
        return render(request, 'login.html', {'error': '用户名或密码错误'})
    
    
    def auth(func):
        def inner(request, *args, **kwargs):
    
            name = request.session.get('user_name')
            if not name:
                return redirect('/login/')
            return func(request, *args, **kwargs)
        return inner
    
    @auth
    def index(request):
        """
        登录成功后跳转的页面
        :param request:
        :return:
        """
        return render(request, 'index.html')
    

    应用场景

    ​ 用户认证、短信验证过期、权限管理

    5. cookie和session的区别

    cookie是存储在客户端浏览器上的键值对,发送请求时浏览器会自动携带. 
    session是一种存储数据方式,基于cookie实现,将数据存储在服务端(django默认存储到数据库).其本质是: 用户向服务端发送请求,服务端做两件事:生成随机字符 串;为此用户开辟一个独立的空间来存放当前用户独有的值.  
    在空间中如何想要设置值:        
    request.session['x1'] = 123        
    request.session['x2'] = 456    
    在空间中取值:        
    request.session['x2']        
    request.session.get('x2')    
    视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中. 
    
  • 相关阅读:
    webpack-dev-server 源码
    2021前端会有什么新的变化
    父类 超类 基类 子类 派生类
    Java的权限修饰符(public,private,protected,默认friendly)
    class修饰符public、private、protected、static、abstract
    hash和签名 、证书
    前端加密解密crypto
    appid app_key app_secret
    sdk开发 、sdk与插件的区别
    CF76C
  • 原文地址:https://www.cnblogs.com/yzm1017/p/11674489.html
Copyright © 2011-2022 走看看