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')