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')    
原文地址:https://www.cnblogs.com/surpass123/p/13063601.html