Django—cookie与session

Cookie

什么是Cookie

就是曲奇。(雾)

HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

简单来说:cookie就是保存在客户端浏览器上的键值对

Django操作cookie

设置cookie
obj1 = HttpResponse()
#obj1也可以是render或者redirect实例化出的对象,只要是HttpResponse对象即可
obj1.set_cookie()

获取
request.COOKIES.get()

删除
obj1.delete_cookie()



三个页面,biskit,home,login

login页面只有在登陆成功后在cookie中设置user键值对
biskit页面进入时校验cookie中有无user键,如没有,则重定向到login页面并且在url中设置保存用户访问状态的键值对。如有user键则校验成功,显示信息


def biskit(request):
    print(request.COOKIES)
    if request.COOKIES.get('user'): #COOKIE中有user表示用户状态为登陆成功
        return render(request,'biskit.html')
    else: #如没有,重定向到login页面并且在url中设置保存 next=用户访问状态的键值对
        path=request.path_info
        return redirect(f'/app01/login/?next={path}')


def login(request):
    print(request.COOKIES)
    if request.POST.get('username')=='jojo' and request.POST.get('password')=='123':
        #判断url中有无next键值对
        next_path=request.GET.get('next')
        if next_path: #如有,在登陆成功后跳转回去
            obj=redirect(next_path)
        else:#如没有 则跳转到home页面
            obj=redirect('/app01/home/')

        obj.set_cookie('user','jojo') # 登陆成功后在cookie中设置user键值对
        return obj #返回Httpresponse对象

    return render(request,'login.html') #如是正常先访问的登陆页面,那就正常显示登陆页面

def home(request):
    return HttpResponse(b'home')



#######注意#######
在测试中发现,只要执行到obj=redirect... 就会清空掉目前obj这个HttpResponse对象中的所有cookie,所以set_cookie放在return之前设置最最保险

Session

什么是Session

session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些的session信息还是绰绰有余的。

简单来说:session就是保存在服务器上的键值对

Django操作session

Django的session会保存在数据库种的django_session表中。

def set_session(request):
    if request.COOKIES.get('user'):
        request.session['username']=request.COOKIES.get('user')
        return HttpResponse(b'session seted')
    else:
        path=request.path_info
        return redirect(f'/app01/login/?next={path}')

def get_session(request):
    print(request.session.get('username'))
    return HttpResponse(request.session.get('username'))


posted @ 2019-10-31 19:20  Sheppard_xxx  阅读(124)  评论(0编辑  收藏  举报