Django Cookie和Session使用(十一)

news2024/11/30 8:48:19

一、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_key
    request.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=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)

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

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

相关文章

2024的十大技术趋势预测

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 2024年&#xff0c;科技圈还会有什么样的新鲜新发生&#xff1f;techradar的记者Lance Ulanoff预测了科技圈的2024十大趋势&#xff0c;包括AI、…

flutter学习-day20-使用SafeArea组件处理各机型的安全距离

文章目录 1. 介绍2. 解析3. 示例和效果图4. 特殊情况 1. 介绍 安全区域&#xff0c;指的是移动端设备的可视窗口范围。处于安全区域的内容不受圆角、刘海屏、iPhone 小黑条、状态栏等的影响&#xff0c;也就是说&#xff0c;我们要做好适配&#xff0c;必须保证页面可视、可操…

FA组件详解

1、了解FA核心组件以及功能 &#xff08;1&#xff09;TC&#xff08;Thin Client&#xff1a;瘦终端&#xff09;&#xff1a;就是类似于机顶盒的一个小盒子&#xff0c;里面有CPU、内存、USB、MIC、HDMI等接口&#xff0c;可以理解为小型电脑&#xff0c;但是它里面是没有操作…

硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件扩展 (SHE)的区别

术语 硬件安全模块 (HSM) &#xff1a;Hardware Security Modules硬件安全引擎 (HSE) &#xff1a;Hardware Security Engines安全硬件扩展 (SHE) &#xff1a; Secure Hardware Extensions 介绍 在汽车行业中&#xff0c;硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件…

【ESP-NOW with ESP32:从多个开发板接收数据(多对一)】

【ESP-NOW with ESP32&#xff1a;从多个开发板接收数据&#xff08;多对一&#xff09;】 1. 项目概况2. 先决条件2.1 环境配置2.2 所需零件 3. 获取接收板 MAC 地址4. ESP32 发送码 &#xff08;ESP-NOW&#xff09;4.1 代码的工作原理4.2 setup&#xff08;&#xff09;4.3 …

第6课 用window API捕获麦克风数据并加入队列备用

今天是2024年1月1日&#xff0c;新年的第一缕阳光已经普照大地&#xff0c;祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒&#xff0c;事业有成。 今天也是我加入CSDN的第4100天&#xff0c;但回过头看一看&#xff0c;这么长的时间也没有在CSDN写下几篇…

Windows 10 安装和开启VNCServer 服务

Windows 10 安装和开启VNCServer 服务 登录云服务器 使用本地RDP登录到配置VNCServer服务的Windows10系统的云服务器。 下载VNC Server安装包 打开官网下载VNCServer安装包 URL&#xff1a;https://www.realvnc.com/en/connect/download/vnc/windows/ 安装VNC Server 双击…

LVGL 在framebuffer设备上的移植

LVGL 在framebuffer设备上的移植 ItemDescDate2023-12-31Authorhongxi.zhuplatformNXP I.MX6ULLLCDSPI TFTLCD NV3030B 文章目录 LVGL 在framebuffer设备上的移植一、LVGL源码获取二、源码修改适配三、编译&运行补充 一、LVGL源码获取 新建lvgl_imx6ull文件夹&#xff0c…

【python_数据分组】

对excel按照标签进行分组&#xff0c;例如按照“开票主体和对方公司”进行分组&#xff0c;并获取对应的明细。 表格如下&#xff1a; def main(excel_data):result {}for d in excel_data:if str(d[0])str(d[1]) in result:result[str(d[0])str(d[1])].append([d[0],d[1],…

MySQL高级SQL语句补充

目录 1.空值&#xff08;NULL&#xff09;和 无值&#xff08; &#xff09;的区别 2.正则表达式 3.存储过程 存储过程的优点 创建存储过程 调用存储过程 查看存储过程 存储过程的参数 IN 输入参数 OUT 输出参数 INOUT 输入输出参数 删除存储过程 存储过程的控制语…

【2024最新版】neo4j安装配置

neo4j安装 写在最前面下载配置环境&#xff08;还是不行&#xff1f;&#xff09;启动neo4jpython中调用 写在最前面 之前我安装过&#xff0c;还写了一篇笔记 结果意外发现没有了&#xff0c;而且和之前安装的步骤不一样了&#xff0c;因此再次记录安装过程 下载 https://ne…

B端产品学习-市场调研与分析

B端产品市场调研与分析 目录&#xff1a; 为什么要做产品调研 B端产品调研对比C端产品调研 B端产品调研要怎么做 为什么要做产品调研 杰克特劳特说过&#xff1a;“成为唯一。如果不能争得第一&#xff0c;那就找到一个能够成为第一的细分&#xff0c;这就是定位的第一法则…

软考网络工程师教程第五版(2018最新版)

软考网络工程师教程第五版(2018最新版) 内容简介 本书是全国计算机技术与软件专业技术资格(水平)考试指定用书。作者在前4版的基础上,根据网络工程师新版大纲的要求,针对考试的重点内容做了较大篇幅的修订,书中主要内容包括数据通信、广域通信网、局域网、城域网、因特网…

K8s实战入门

1.NameSpace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中&#xff0c;可能不想让两个Pod之间进行互相…

用LCD显示字符‘A‘

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit RSP2^0; //寄存器选择位&#xff0c;将RS位定义为P2.0引脚 sbit RWP2^1; //读写选择位&#xff0c;将RW位定义为P2.1引脚 sbit EP2^2; //使能…

用LCD循环右移显示“Welcome to China“

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 sbit RSP2^0; //寄存器选择位&#xff0c;将RS位定义为P2.0引脚 sbit RWP2^1; //读写选择位&#xff0c;将RW位定义为P2.1引脚 sbit EP2^2; //使能…

「Verilog学习笔记」乘法与位运算

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 观察乘数的特点&#xff1a; 1111_1011 1_0000_0000 - 1 - 100 timescale 1ns/1nsmodule dajiang13(input [7:0] A,output [15:0] B);//*************code*********…

Unity Shader UVLightReveal (紫外线显示,验钞效果)

Unity Shader UVLightReveal &#xff08;紫外线显示&#xff0c;验钞效果&#xff09; UVLight Reveal 实现验钞机的效果实现方案操作实现1.Light2.将另一个图形加入3.加上图形效果4.加上灯光的颜色自定义判定 源码 UVLight Reveal 实现验钞机的效果 大家应该都有见过验钞机验…

力扣:452. 用最少数量的箭引爆气球(贪心)

题目&#xff1a; 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。…

apache httpd多后缀解析漏洞复现

一、漏洞描述 Apache Httpd支持一个文件拥有多个后缀,不同的后缀执行不同的命令,也就是说当我们上传的文件中只要后缀名含有php,该文件就可以被解析成php文件,利用Apache httpd这个特性,就可以绕过上传文件的白名单。 该漏洞和apache版本和php版本无关,属于用户配置不当造成的解…