zoukankan      html  css  js  c++  java
  • day70---日考

    day70日考

    考题

    """
    1.什么是cookie和session,你能描述一下它们的由来和工作机制吗(切勿糊弄,敷衍了事)
    2.django中如何操作cookie和session,请写出尽量多的操作方法,并针对session的操作方法详细内部发生的事情,django默认的session失效时间是多久(切勿糊弄,敷衍了事)
    3.面相对象中的__init__和__new__的区别是什么,利用__new__可以实现什么
    4.如何给CBV添加装饰器,列举你所知道的几种方式
    """
    

    1.什么是cookie和session,你能描述一下它们的由来和工作机制吗

    我们知道HTTP协议是无状态的,不能够保存用户的状态信息。cookie就是来完成保存用户信息的,当用户第一次登录后,会将用户的登录信息返回给浏览器,以kv键值对的形式进行存储,之后用户再次访问该网站的时候,浏览器会携带之前保存的用户信息快速验证登录。(不安全)
    
    session技术师针对cookie技术存在的安全隐患而提出的一种解决方案。当用户第一次登录后,服务端会随机生成一个字符串sessionkey,在服务端以{sessionkey:'用户登录信息'}形式存储,并将该字符串返回给浏览器以{sessionid:sessionkey}形式存储,当用户再次访问该网站的时候,会携带该字符串去后端校验匹配,匹配成功则通过登录。
    
    因此session是基于cookie工作的
    

    2.django中如何操作cookie和session,请写出尽量多的操作方法,并针对session的操作方法详细内部发生的事情,django默认的session失效时间是多久。

    django中操作cookie的方法:
    设置cookie:
    res = render() or redirect() or HttpResponse() or JsonResponse()
    res.set_cookie('username','jason_dsb',salt='加密盐',max_age=100,expires=None)
    针对IE浏览器的超时要用expires
    
    获取cookie:
    request.COOKIES.get('username')
    # 获取加盐的cookie
    request.get_signed_cookie('username',salt='123jason')
    
    删除cookie:
    res.delete_cookie('username')
    
    
    
    """
    检测用户是否登录才能使用功能的装饰器
    from functools import wraps
    def login_auth(func):
    	@wraps(func)
    	def inner(request,*args,**kwargs):
    		target_url = request.get_full_path()
    		if request.session.get('username'):
    			res = func(request,*args,**kwargs)
    		else:
    			res = redirect(f'/login/?next={target_url}')
    		return res
    	return inner
    	
    request.path()  # 获取url 如:'/login/'
    request.path_info() # 获取url 如:'/login/'
    request.get_full_path()  # 获取路径加get请求携带的参数,如:'/login/?next=/home/'
    		
    """
    
    
    session是存储在服务端的,django默认是使用django-session表用来存储数据。如果你想要操作session, 首先要执行数据库迁移的两条命令将表django-session表创建出来:
    python manage.py makemigrations
    python manage.py migrate
    
    django默认的session失效时间是2个星期(14天)。
    session的数据可以存储在后端的很多地方,如:
    (1)表;(2)文件;(3)缓存;(4)其他 ...
    
    
    django中操作session的方法:
    设置session:
    request.session['username'] = 'jason_dsb'
    request.session.setdefault('username','jason_dsb')  #存在则不设置
    
    获取session:
    request.session['username']
    request.session.get('username',None)
    
    删除session:
    request.session.flush()
    request.session.delete()
    
    设置超时时间:
    request.session.set_expiry()
    """
    1、数字                              秒数
    2、datetime/timedelta格式            日期格式
    3、None                             参加全局策略失效
    4、0                                窗口关闭失效
    
    注意:set_expiry()参数不支持时间戳!!!
    """
    
    request.session.get('username'):
    """
    1.自动从浏览器请求中获取sessionid对应的随机字符串;
    2.拿着该字符串去django_session表中,查找对应的数据;
    3.如果匹配上了,则将对象的数据取出,并以字典的形式封装到request.session中,
    4.如果匹配不上,request.session.get()得到的值就是None
    """
    

    3.面相对象中的__init__和__new__的区别是什么,利用__new__可以实现什么

    __init__用来对象初始化;__new__用来创建一个空对象并返回。
    利用__new__可以在对象创建时增加一些属性等,还比如可以用它实现单例模式
    

    4.如何给CBV添加装饰器,列举你所知道的几种方式

    CBV添加装饰器,django官方推荐使用内置的method_decorator()函数
    
    三种方式:
     1 加在方法上@method_decorator(decorator_name)
     2 加在类上@method_decorator(decorator_name, method_name)
     3 加载自己派生重写的dispatch方法上@method_decorator(decorator_name)
        
    
    from django.utils.decorator import method_decorator
    
    # 第一种
    class MyLogin(View):
        def get(self,request):
            return HttpResponse('jason_dsb')
        
        @method_decorator(login_auth)
        def post(self,request):
            return HttpResponse('egon_dsb')
    
    # 第二种
    @method_decorator(login_auth,name='post')
    class MyLogin(View):
        def get(self,request):
            return HttpResponse('tank_dsb')
        
        def post(self,request):
            return HttpResponse('kevin_dsb')
        
    # 第三种
    class MyLogin(View):
        @method_decorator(login_auth)
        def dispatch(self,request,*args,**kwargs):
            return super(MyLogin,self).dispatch(request,*args,**kwargs)
        
        def get(self,request):
            return HttpResponse('tank_dsb')
        
        def post(self,request):
            return HttpResponse('kevin_dsb')    
    
  • 相关阅读:
    Vector-Constructors
    C++:多维数组的动态分配(new)和释放(delete)
    C++:多维数组的动态分配(new)和释放(delete)
    COM_利用GetWallpaper()获取墙纸路径
    COM_利用GetWallpaper()获取墙纸路径
    COM 技术相关概念
    COM 技术相关概念
    全排列与next_permutation
    全排列与next_permutation
    屏蔽MFC程序中的ESC键和ENTER键关闭窗口
  • 原文地址:https://www.cnblogs.com/surpass123/p/13063601.html
Copyright © 2011-2022 走看看