会话技术(一):Cookie

1 出现场景

  • 服务器如何识别客户端
  • Http在Web开发基本都是短连接。

2 请求声明周期

从request开始,到response结束。

3 种类

(1) Cookie:

  • 客户端会话技术,数据存储在客户端
  • 键值对存储
  • 支持过期时间
  • 默认Cookie会自动携带本网站的所有Cookie
  • Cookie跨域名、跨网站
  • 通过HttpResponse
  • Cookie默认不支持中文
    • 设置Cookie支持中文Base64
  • Cookie可以加密

(2)Session

(3)Token

4 Cookie

浏览器端的会话技术,Cookie本身由浏览器生成,通过Response将Cookie写到浏览器上,下一次访问,浏览器会根据不同的规则携带Cookie过来。

Cookie不能跨浏览器。

(1)设置Cookie

# 设置Cookie
response.set_cookie(self, key, value='', max_age=None, expires=None, path='/',
                   domain=None, secure=False, httponly=False)

属性:

  • max_age:整数,指定Cookie过期时间,单位:
    • max_age设置为0,浏览器关闭失效
    • max_age设置为None,永不过期
  • expires:整数,指定Cookie过期时间,还支持一个datetime或者timedelta,可以指定一个具体的日期。
    • expires=timedelta(days=10),10天后过期。
      max_age和expires两个选一个指定。

过期时间的几个关键时间。

(2)获取Cookie

# 获取Cookie
request.GET.get(key,defaultValue)
request.POST.get(key,defaultValue)

(3)加密写法

俗称:加盐,salt字段用途为,用什么salt加密的,就要用什么salt解密。

# 加密写法
response.set_signed_cookie('uname',uname,salt='miyao')

# 解密写法
uname = request.get_signed_cookie(key='uname',salt='miyao')

用例:登录账号,并用cookie记录,进入个人页面。(一段时间内都不用再次登录即可进入个人主页)

(1)URL配置

# 根路由
urlpatterns = [
    url(r'^one/',include('one.urls',namespace='second')),		# app名称
]

# 子路由
urlpatterns=[
    url(r'^login/',views.login,name='login'),					# 登录动作
    url(r'^dologin/',views.dologin,name='dologin'),				# 登录成功设置Cookie
    url(r'^mine/', views.mine, name='mine'),					# 进入个人主页显示账号
    url(r'^logout/', views.logout, name='logout'),				# 登出
]

(2)视图函数

from django.shortcuts import render, redirect
from django.urls import reverse

def login(request):
    return render(request,'login.html')


def dologin(request):
    uname = request.POST.get('uname')       # 获取值
    response = HttpResponse('登录成功')
    response.set_cookie('uname',uname)		# 设置cookie
    return response

def mine(request):
    try:
        uname= request.COOKIES.get('uname')		# # 取值 
        if username:
            return render(request, 'mine.html', context={'uname':uname})
    except Exception as e:
        print(e)
    return redirect(reverse('second:login'))

def logout(request):

    response = redirect(reverse('second:login'))
    response.delete_cookie('uname')			# 从响应中删除cookie即可。

    return response

(3)模板login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<form action="{% url 'second:dologin' %}" method="post">
    <span>用户名:</span><input type="text" placeholder="请输入用户名" name="uname">

    <br>

    <button>登录</button>

</form>
</body>
</html>

模板mine.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ uname}}
<a href="{% url 'second:logout' %}">退出登录</a>
</body>
</html>

(4)访问,并填写账号

会话技术(一):Cookie_第1张图片
自动跳转至
会话技术(一):Cookie_第2张图片
访问个人主页。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200131185722524.png会话技术(一):Cookie_第3张图片

如果清除Cookie则不能再次进入个人主页。
会话技术(一):Cookie_第4张图片

需求:改为自动跳转个人主页。

使用重定向将视图函数修改为

def login(request):

    return render(request,'login.html')


def dologin(request):

    uname = request.POST.get('uname')       # 获取值
    response = HttpResponseRedirect(reverse('second:mine'))		# 重定向跳转
    response.set_cookie('uname',uname)

    return response

会话技术(一):Cookie_第5张图片
会话技术(一):Cookie_第6张图片

你可能感兴趣的:(#,Django,cookie,web,django,python)