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

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

 

三、登录中应用cookie和session

 (1) 模型数据

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)首页

<!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)注册页面

<!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)    登录页面

<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)路由

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)视图

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=unameuser.password=upassuser.age=ageuser.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)#使用sessionrequest.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')# 删除sessionsession_key=request.session.session_keyrequest.session.delete(session_key)#返回return response

(5)运行

 

四、总结

cookie就是保存在客户端浏览器上的信息
session就是保存在服务端上的信息
session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用到cookie)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费API-JSONPlaceholder使用手册

官方使用指南快速索引>>点这里 快速导览&#xff1a; 什么是JSONPlaceholder?有啥用?如何使用JSONPlaceholder? 关于“增”关于“改”关于“查”关于“删”关于“分页查”关于“根据ID查多个” 尝试自己搭一个&#xff1f;扩展的可能&#xff1f; 什么是JSONPlaceho…

面向对象(高级)知识点强势总结!!!

文章目录 一、知识点复习1-关键字&#xff1a;static1、知识点2、重点 2-单例模式&#xff08;或单子模式&#xff09;1、知识点2、重点 3-理解main()方法1、知识点2、重点 4-类的成员之四&#xff1a;代码块1、知识点2、重点 5-关键字&#xff1a;final1、知识点2、重点 6-关键…

新建虚拟环境并与Jupyter内核连接

第一步:在cmd里新建虚拟环境,shap38是新建的虚拟环境的名字 ,python=3.x conda create -n shap38 python=3.8第二步,安装ipykernel,打开anconda powershell prompt: 虚拟环境的文件夹位置,我的如图所示: 进入文件夹并复制地址: 输入复制的文件夹地址更改文件夹:…

交换域系数的选择:图像处理与编码的关键策略

在图像处理和编码领域&#xff0c;选择适当的交换域系数对于实现高效的图像处理和编码至关重要。交换域系数是指在特定的数学变换下产生的频域系数。通过选择合适的交换域系数&#xff0c;可以实现图像的压缩、增强和重构。本文将深入探讨交换域系数的选择在图像处理和编码中的…

你好!Apache Seata

北京时间 2023 年 10 月 29 日&#xff0c;分布式事务开源项目 Seata 正式通过 Apache 基金会的投票决议&#xff0c;以全票通过的优秀表现正式成为 Apache 孵化器项目&#xff01; 根据 Apache 基金会邮件列表显示&#xff0c;在包含 13 个约束性投票 (binding votes) 和 6 个…

Qt学习:Qt的意义安装Qt

Qt 的简介 QT 是一个跨平台的 C图形用户界面应用程序框架。它为程序开发者提供图形界面所需的所有功能。它是完全面向对象的&#xff0c;很容易扩展&#xff0c;并且允许真正地组件编程。 支持平台 xP 、 Vista、Win7、win8、win2008、win10Windows . Unix/Linux: Ubuntu 等…

【ARMv8M Cortex-M33 系列 2.1 -- Cortex-M33 使用 .hex 文件介绍】

文章目录 HEX 文件介绍英特尔十六进制文件格式记录类型hex 示例Cortex-M 系列hex 文件的使用 HEX 文件介绍 .hex 文件通常用于微控制器编程&#xff0c;包括 ARM Cortex-M 系列微控制器。这种文件格式是一种文本记录&#xff0c;用于在编程时传递二进制信息。.hex 文件格式最常…

docker学习笔记02-安装mysql

1.安装mysql8 下载MySQL镜像 docker pull mysql:8.0创建并启动容器 docker run -itd --name mysqltest -p 9999:3306 -e MYSQL_ROOT_PASSWORD123456 mysql其中-it是交互界面 -d是后台执行 -name 指定容器名称 -p指定映射端口 -e设置环境变量 最后mysql是镜像名或者用镜像id如…

Flask 日志

flask 日志 代码源码源自编程浪子flask点餐小程序代码 记录用户访问日志 和 错误日志 这段代码是一个基于Flask框架的日志服务类&#xff0c;用于 记录用户访问日志 和 错误日志。代码中定义了一个名为LogService的类&#xff0c;其中包含了两个静态方法&#xff1a;addAcc…

XUbuntu22.04之删除多余虚拟网卡和虚拟网桥(二百零四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

用Xshell连接虚拟机的Ubuntu20.04系统记录。虚拟机Ubuntu无法上网。本机能ping通虚拟机,反之不能。互ping不通

先别急着操作&#xff0c;看完再试。 如果是&#xff1a;本机能ping通虚拟机&#xff0c;反之不能。慢慢看到第8条。 如果是&#xff1a;虚拟机不能上网&#xff08;互ping不通&#xff09;&#xff0c;往下一直看。 系统是刚装的&#xff0c;安装步骤&#xff1a;VMware虚拟机…

【Linux】 last 命令使用

last 命令 用于检索和展示系统中用户的登录信息。它从/var/log/wtmp文件中读取记录&#xff0c;并将登录信息按时间顺序列出。 著者 Miquel van Smoorenburg 语法 last [-R] [-num] [ -n num ] [-adiox] [ -f file ] [name...] [tty...]last 命令 -Linux手册页 选项及作用…

vue项目表单使用正则过滤ip、手机号

import useFormValidate from /hooks/useFormValidatesetup(props, { emit }) {const { validateName, validateIPAndPort } useFormValidate()const state reactive({workFaceInfo: props.info?.id ? props.info : {},sysTypeData: props.sysType,formRules: {name: [{req…

SpringBoot 在IDEA中实现热部署 (JRebel实用版)

JRebel简介&#xff1a; JRebel是与应用程序服务器集成的JVM Java代理&#xff0c;可使用现有的类加载器重新加载类。只有更改的类会重新编译并立即重新加载到正在运行的应用程序中&#xff0c;JRebel特别不依赖任何IDE或开发工具&#xff08;除编译器外&#xff09;。但是&am…

『Linux升级路』冯诺依曼体系结构与操作系统

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;Linux &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、冯诺依曼体系结构 &#x1f4d2;1.1为什么要有体系结构 &#x1f4d2;1.2…

虚函数的讲解

文章目录 虚函数的声明与定义代码演示基类Person派生类Man派生类Woman 测试代码动态绑定静态绑定访问私有虚函数总结一下通过成员函数指针调用函数的方式 虚函数的声明与定义 虚函数存在于C的类、结构体等中&#xff0c;不能存在于全局函数中&#xff0c;只能作为成员函数存在…

C# MVC +Layui侧边导航栏的收缩及展开

目录 1、头部代码 2、侧边栏&#xff08;例子只写了一级导航&#xff0c;需要多级可自行添加&#xff09; 3、body内容填充 4、 JS 1、头部代码 <div class"layui-layout layui-layout-admin"> <div class"layui-header"> …

MAVLINK生成自定义消息

git clone https://github.com/mavlink/mavlink.gitcd mavlinkgit submodule update --init --recursivepython -m mavgenerate出现以下界面 XML填写自定义xml路径&#xff0c;内容可以参考mavlink/message_definitions/v1.0 Out为输出路径 <?xml version"1.0"…

如何用Python批量计算Word中的算式

一、问题的提出 到了期末&#xff0c;大家都在忙着写总结、改试卷、算工作量&#xff0c;写总结可以借助于ChatGPT&#xff0c;改试卷可以用星火的自动批阅功能&#xff0c;算工作量就是一项比较棘手的问题&#xff0c;因为它涉及很多算式&#xff0c;有时需要老师用计算器算来…

Linux操作系统极速入门[常用指令](安装jdk,MySQL,nginx),以及在linux对项目进行部署。

linux概述&#xff1a; Linux是一套免费使用和自由传播的操作系统 我们为什么要学&#xff0c;Linux&#xff1f; 主流操作系统&#xff1a; linux系统版本&#xff1a; 内核版&#xff1a; 由linux核心团队开发&#xff0c;维护 免费&#xff0c;开源 负责控制硬件 发行版&…