Django Cookie和Session使用(十一)

一、Cookie

Cookie具体指一小段信息,它是服务器发送出来存储在浏览器上的一组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

Cookie的特性

1、服务器让浏览器进行设置的

2、保存在浏览器本地,浏览器也可以不保存

3、下次访问自动携带cookie保存的信息

操作Cookie

(1) 设置cookie

response.set_cookie(key,value)

(2) 获取cookie

request.COOKIES.get(key)

(3) 设置cookie的时候可以添加一个超时时间

response.set_cookie('userid', '2',max_age=7*24*300,expires=7*24*300)

max_age, expires
两者都是设置超时时间的 并且都是以秒为单位
需要注意的是 针对IE浏览器需要使用expires

(4) 手动删除cookie(注销功能)

response.delete_cookie('userid')

二、Session

保存在服务器上的一组组键值对,必须依赖于Cookie

为何使用Session

1、cookie保存在浏览器本地不安全,

2、cookie的大小收到限制

操作Session

(1) session数据是保存在服务端的,给客户端返回的是一个随机字符串

#客户端
sessionid:随机字符串

(2)设置session

request.session['key'] = value

1.django内部会自动帮你生成一个随机字符串
2.django内部自动将随机字符串和对应的数据存储到django_session表中
2.1先在内存中产生操作数据的缓存
2.2在响应结果django中间件的时候才真正的操作数据库
3.将产生的随机字符串返回给客户端浏览器保存

(3)设置过期时间

request.session.set_expiry(7*24*300)

源码:

括号内可以放四种类型的参数

integer 整数 : 多少秒
datetime日期对象 : 到指定日期就失效
0 : 一旦当前浏览器窗口关闭立刻失效
不写 : 失效时间就取决于django内部全局session默认的失效时间

(4) 获取session

request.session.get('key')

(5) 清除session

python 复制代码
    session_key=request.session.session_key
    request.session.delete(session_key)

request.session.delete() # 只删服务端的 客户端的不删

三、登录中应用cookie和session

(1) 模型数据

python 复制代码
from django.db import models

# Create your models here.
class UserModel(models.Model):
    username=models.CharField(max_length=30,unique=True)
    password=models.CharField(max_length=10)
    age=models.IntegerField(default=17)

    class Meta:
        db_table='user'
        verbose_name='用户'
        verbose_name_plural=verbose_name


#记得迁移文件

(2-1)首页

python 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
    <h1>首页</h1>
    <hr/>
    {% if user %}
      当前登录用户:<h3>{{ user.username }} <a href="{% url 'logout' %}">注销</a></h3>

    {% else %}
        <a href="{% url 'register' %}">注册</a>
        <a href="{% url 'login' %}">登录</a>
    {% endif %}
</body>
</html>

(2-2)注册页面

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
</head>
<body>
    <h1>注册</h1>
    <hr/>
{#    表单提交#}
    <form action="" method="post">
        {% csrf_token %}
        <p>用户<input type="text" name="username"></p>
        <p>密码<input type="password" name="password"></p>
        <p>年龄<input type="text" name="age"></p>
        <p><button>注册</button></p>
    </form>
</body>
</html>

(2-3) 登录页面

python 复制代码
<body>
    <h1>登录</h1>
    <hr/>
   <form action="" method="post">
        {% csrf_token %}
        <p>用户<input type="text" name="username"></p>
        <p>密码<input type="password" name="password"></p>
        <p><button>登录</button></p>
    </form>
</body>

(3)路由

python 复制代码
urlpatterns = [
    path('', index),  # 默认打开首页
    # 起别名
    path('index/', index, name='index'),
    path('login/', login, name='login'),
    path('register/', register, name='register'),
    path('logout/', logout, name='logout'),

    path('admin/', admin.site.urls),
]

(4)视图

python 复制代码
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse    #路由

from user.models import *

# Create your views here.
#首页
def index(request):
    #获取cookie数据
    # uid=request.COOKIES.get('userid',0)

    # 获取session数据
    uid = request.session.get('userid', 0)

    #获取登录的用户信息
    user = UserModel.objects.filter(id=uid).first()


    return render(request,"index.html",{'user':user})

#注册
def register(request):
    #判断
    if request.method=='GET':
       return render(request,"register.html")
    elif request.method=='POST':
        #请求数据
        uname=request.POST.get('username')
        upass=request.POST.get('password')
        age=request.POST.get('age')
        print(uname,upass,age,sep='=======') #后台打印

        #先判断用户是否存在
        username=UserModel.objects.filter(username=uname)
        if username.exists():
            return HttpResponse('用户已存在!')

        #添加到数据库中
        try:
            user=UserModel()
            user.username=uname
            user.password=upass
            user.age=age
            user.save()
        except:
            return HttpResponse('注册失败!')
        #注册成功,直接跳到登录页面
        return redirect(reverse('login'))



#登录
def login(request):
    # 判断
    if request.method == 'GET':
        return render(request, "login.html")
    elif request.method == 'POST':
        # 请求数据
        uname = request.POST.get('username')
        upass = request.POST.get('password')
        print(uname, upass, sep='=======')  # 后台打印

        #2.登录验证
        users=UserModel.objects.filter(username=uname,password=upass)
        #判断
        if users.exists():
            #获取数据
            user=users.first()
            #3.设置cookie
            #跳转到首页
            response=redirect(reverse('index'))
            #创建cookie,设置过期时间max_age=7天
            # response.set_cookie('userid',user.id,max_age=7*24*300)
            # response.set_cookie('userid',user.id)

            #使用session
            request.session['userid']=user.id
            #设置过期时间
            # request.session.set_expiry(7*24*300)


    return response



#注销
def logout(request):
    # 跳转到首页
    response = redirect(reverse('index'))

    #删除cookie
    # response.delete_cookie('userid')

    # 删除session
    session_key=request.session.session_key
    request.session.delete(session_key)

    #返回
    return response

(5)运行

四、总结

cookie就是保存在客户端浏览器上的信息

session就是保存在服务端上的信息

session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用到cookie)

相关推荐
何大春几秒前
【弱监督语义分割】Self-supervised Image-specific Prototype Exploration for WSSS 论文阅读
论文阅读·人工智能·python·深度学习·论文笔记·原型模式
在下不上天9 分钟前
Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
大数据·开发语言·python
SEVEN-YEARS12 分钟前
深入理解TensorFlow中的形状处理函数
人工智能·python·tensorflow
EterNity_TiMe_17 分钟前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
Suyuoa28 分钟前
附录2-pytorch yolov5目标检测
python·深度学习·yolo
Iced_Sheep41 分钟前
干掉 if else 之策略模式
后端·设计模式
XINGTECODE1 小时前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
程序猿进阶1 小时前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺1 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
好看资源平台2 小时前
网络爬虫——综合实战项目:多平台房源信息采集与分析系统
爬虫·python