第五十二篇 cookie和session介绍

心得:过年休息了一段时间终于又回到自己的学习进度上了,是时候慢慢的回到正轨了,新的一年希望自己好事多多。在这次的武汉疫情中,我相信我们国家的能力,从透明公开到逐一排查,我们都是相当自律,你很难想象14亿人口的健康状态普查,然后统计,在其他国家很难想象到有如此自律的公民吧,大家都心系健康,坚持走向成功,中国真正的显示出了一方有难八方支援的精神,很团结,希望在疫情过后,大家能更加有素质,有卫生的保护好自己,保护这个国家。

1. 什么是cookie

HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。

2. cookie的原理

cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。

3.获取cookie,设置cookie和删除cookie

获取cookie
获取cookie的两种方法

request.COOKIES['key']
request.COOKIES.get('key')

设置cookie

rep = HttpResponse(...)
rep = render(request, ...)

rep.set_cookie(key,value,...)

参数:
key, 键
value=’’, 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn’t been already.)
path=’/’, Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问

删除cookie

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 删除用户浏览器上之前设置的user的cookie值
    return rep

4.cookie的实例

1.我们通常见到的登录页面,采用的就是cookie,如果没有cookie的限制,我们每个网页都是相互独立,所以我们在登录之后,才给予相关网页的权限,这就需要cookie功能,先看以下没有cookie的代码,各个网页不相关。

#urls.py
from django.urls import path,re_path
from . import views
app_name = "front"

urlpatterns = [
    path(r'index/',views.index,name='index'),
    path(r'login/',views.login,name='login'),
]

#views.py
from django.shortcuts import render,HttpResponse,redirect,reverse
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
def index(request):
    return HttpResponse("哈喽")

@csrf_exempt
def login(request):
    if request.method == "POST":
        user = request.POST.get('user')
        password = request.POST.get('password')
        # print(user,password)
        if user == 'root' and password =='root':
            return redirect(reverse('front:index'))
    else:
        return render(request,'login.html')

#login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>账号
        <input type="text" name="user">
    </p>
    <p>密码
        <input type="password" name="password">
    </p>
    <input type="submit">
</form>
</body>
</html>

2. Cookie版登录校验代码

urls.py

from django.urls import path,re_path
from . import views
app_name = "front"

urlpatterns = [
    path(r'index/',views.index,name='index'),
    path(r'login/',views.login,name='login'),
    path(r'home/',views.home,name='home'),
    path(r'logout/',views.logout,name='logout'),
]

views.py

from django.shortcuts import render,HttpResponse,redirect,reverse
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
#写成装饰器来修饰页面
def login_required(fn):
    def inner(request,*args,**kwargs):
        if not request.COOKIES.get('haha') == '1':
            next=request.path_info
            return redirect('/login/?next=%s'%next)
        ret=fn(request,*args,**kwargs)

        return ret
    return inner

@login_required
def index(request):
    return render(request,'index.html')

@login_required
def home(request):
    return render(request,'home.html')

@csrf_exempt
def login(request):
    if request.method == "POST":
        user = request.POST.get('user')
        password = request.POST.get('password')
        # print(user,password)
        if user == 'root' and password =='root':
            next=request.GET.get('next')
            #判断登录前的请求页面也多少,然后登录之后直接跳转过去
            if next:
                ret=redirect(next)
            else:
                ret = redirect(reverse('front:index'))
            ret.set_cookie('haha','1')
            return ret
    else:
        return render(request,'login.html')

#退出登录并删除本次cookie,删除cookie之后,登录记录会消失,退出登录
def logout(request):
    ret = redirect(reverse('front:login'))
    ret.delete_cookie('haha')
    return ret

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>账号
        <input type="text" name="user">
    </p>
    <p>密码
        <input type="password" name="password">
    </p>
    <input type="submit">
</form>
</body>
</html>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>home</title>
</head>
<body>
<h2>我是HOME</h2>
<a href="{% url 'front:logout' %}">注销</a>
</body>
</html>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<h2>我是index</h2>
<a href="{% url 'front:logout' %}">注销</a>
</body>
</html>

5.Session的介绍

Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。

简而言之,服务器先给浏览器发送一个cookie,当浏览器访问数据库时,可以辨认此浏览器的信息,并可以在服务器上保存一段加密的信息。

在这里插入图片描述

获取设置删除:

# 获取
request.session['k1']
request.session.get('k1',None)
#设置
request.session['k1'] = 123  #常用
request.session.setdefault('k1',123) # 存在则不设置
#删除
del request.session['k1']

设置session

# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 会话session的key
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")

# 删除当前会话的所有Session数据
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush() 
    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout() 函数中就会调用它。

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。

Session验证登录代码

from django.shortcuts import render,HttpResponse,redirect,reverse
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
#写成装饰器来修饰页面
def login_required(fn):
    def inner(request,*args,**kwargs):
        if not request.session.get('haha') == '1':
            next=request.path_info
            return redirect('/login/?next=%s'%next)
        ret=fn(request,*args,**kwargs)

        return ret
    return inner

@login_required
def index(request):
    return render(request,'index.html')

@login_required
def home(request):
    return render(request,'home.html')

@csrf_exempt
def login(request):
    if request.method == "POST":
        user = request.POST.get('user')
        password = request.POST.get('password')
        # print(user,password)
        if user == 'root' and password =='root':
            next=request.GET.get('next')
            #判断登录前的请求页面也多少,然后登录之后直接跳转过去
            if next:
                ret=redirect(next)
            else:
                ret = redirect(reverse('front:index'))
            request.session['haha']='1'
            request.session.set_expiry(0)
            return ret
    else:
        return render(request,'login.html')

#退出登录并删除本次cookie,删除cookie之后,登录记录会消失,退出登录
def logout(request):
    request.session.flush()
    ret = redirect(reverse('front:login'))
    return ret
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值