cookie与session

一、cookie与session

它们的作用是:保存信息

背景:因为http协议是无状态的

cookie:保存在客户端浏览器上的键值对。

session:保存在服务端上的键值对。

原理:

当你第一次登陆成功之后,服务端给你返回了一个随机字符串。
保存客户端浏览器上之后再次朝服务端发请求,只需要携带该随机字符串
服务端就能够识别当前用户身份,无需再登。

 

 

 

 

 

 

 注意:

cookie虽然是保存在客户端的浏览器上的 但是是服务端设置的
浏览器也是可以拒绝服务端对要求 不保存cookie。如果拒绝,就无法使用浏览器了。

 

 

 如果关了cookie

二、cookie操作

views文件中

一定要利用HttpResponse类直接或间接产生的对象

1、设置

obj = HttpResponse('...')
obj.set_cookie(k,v)
obj.set_cookie(k,v,max_age/expire)   可以设置超时时间

'''''''''''

return HttpResponse('某某')
return render(...)
return redirect(...)

或者

obj = HttpResponse('某某')
return obj

obj1 = render(...)
return obj1

obj2 = redirect(...)

return obj2

'''''''''

2、获取

request.COOKIES.get(k)

3、删除

obj = HttpResponse('...')
obj.delete_cookie(k,v)

4、基于cookie写校验用户登录装饰器并且能够记住用户上一次想要访问的url

 

 

 

 问题:需要保存用户的登录状态

修改

 

 

 

 

 

 问题:当用户访问home时,要校验用户是否登录。

修改

 

 

 问题:用户访问多个页面。都需要校验是否登录,这时要用装饰器。

修改:

#登录装饰器
from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
# 在执行装饰器函数之前做的事情
if request.COOKIES.get('username'): res = func(request,*args,**kwargs) return res else: return redirect('/login/') return inner #cookie登录 def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if username == 'liuliu' and password == '123': # return HttpResponse('登录成功') # 注意仅仅返回登录成功是不够的,要的是登录后跳转到另一个页面 obj=redirect('/home/') # 生成一个对象,直接跳转到home页面 obj.set_cookie('username','jason666') #设置cookie。'jason666'这个地方不能用中文 return obj return render(request,'login.html') #定义一个跳转的home页面 @login_auth def home(request): # if request.COOKIES.get('username'): # return HttpResponse('我是home页面,只有登录的用户才能访问') # else: # return redirect('/login') return HttpResponse('我是home页面,只有登录的用户才能访问') #定义一个跳转的index页面 @login_auth def index(request): return HttpResponse('我是index页面,只有登录的用户才能访问') #定义一个跳转的demo页面 @login_auth def demo(request): return HttpResponse('我是demo页面,只有登录的用户才能访问')

问题:怎样拿到用户想访问的页面,并跳转到想访问的页面

两个方法

request.path_info

request.get_full_path()

print('request.path_info:',request.path_info)                                     # 只拿路径部分 不拿参数
print('request.get_full_path():',request.get_full_path())                    # 路径加参数

 

 

 修改:

#登录装饰器
from functools import wraps
def login_auth(func):
    @wraps(func)
    def inner(request,*args,**kwargs):
        # print(request.path_info)       # path_info是request对象的属性
        # print(request.get_full_path()) # get_full_path()是request对象的方法
        target_url = request.path_info   # 获取用户想要访问的页面
        if request.COOKIES.get('username'):
            res = func(request,*args,**kwargs)
            return res
        else:
            return redirect('/login/?next=%s'%target_url) # 在这里显示用户登录后直接跳转到想要访问的页面,这是利用了get请求方式
    return inner

#cookie登录
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'liuliu' and password == '123':
            # return HttpResponse('登录成功')
            # 注意仅仅返回登录成功是不够的,要的是登录后跳转到另一个页面
            target_url = request.GET.get('next')         #拿到用户想要访问页面的后缀
            if target_url:
                obj=redirect(target_url)                 # 生成一个对象,直接跳转到home页面
            else:                                        # 如果用户没有想要访问的页面,就定向主页面去
                obj=redirect('/home/')
            obj.set_cookie('username','jason666',max_age=3) #设置cookie。'jason666'这个地方不能用中文,max_age=3表示的是cookie值保存的时间
            return obj
    return render(request,'login.html')

#定义一个跳转的home页面
@login_auth
def home(request):
    return HttpResponse('我是home页面,只有登录的用户才能访问')
#定义一个跳转的index页面
@login_auth
def index(request):
    return HttpResponse('我是index页面,只有登录的用户才能访问')

#定义一个跳转的demo页面
@login_auth
def demo(request):
    return HttpResponse('我是demo页面,只有登录的用户才能访问')

#注销功能
@login_auth
def logout(request):
    obj =HttpResponse('注销成功')
    obj.delete_cookie('username')
    return obj

三、session操作

django操作session默认需要使用内置的一张django_session表
如果没有执行过数据库迁移命令,会报错:no such table:django_session
django默认的超时时间为14天

1、设置

request.session['username'] = 'jason'
"""
 01.产生一个随机字符串
 02.取django session存储数据 session_key就是产生的随机字符串 session_data就是要保存的数据 expire_date超时时间
 03.将产生的随机字符串返回给浏览器 浏览器本地保存键值对
sesssionid:随机字符串
"""

2、获取

request.session.get('username')
"""
 01.自动取请求头中查找cookie锁携带的键值对 获取到随机字符串
 02.拿着随机字符串取django_session表中比对数据
 03.有的话就将对应的数据取出放到request.session中
"""

3、删除

request.session.flush()                   # 推荐

request.session.delete()

4、设置超时时间

request.session.set_expiry(value)


* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。

session不一定非要存到数据库
文件
缓存数据库
数据

#设置session值
#要保存到哪呢?有很多地方,可以是数据库
def set_session(request):
    request.session['username']='jason666'  #设置session值
    request.session.set_expiry(5)          # 设置值的保存时间
    return HttpResponse('set_session')


#获取session值

def get_session(request):
    print(request.session.get('username'))  # 请求里携带着session值
    return HttpResponse('get_session')

#注销session值
def del_session(request):
    request.session.flush()
    return HttpResponse('注销了')
posted @ 2020-01-14 21:57  薛定谔的猫66  阅读(216)  评论(0)    收藏  举报