当前位置: 首页 > news >正文

Django-cookie,session

Cookie简介

Cookie,有时也用Cookies,是指web程序为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密),一般是以键值对的形式存在,Cookie具有不可跨域名性

Cookie是http协议中定义在 header 中的字段

Cookie解决无状态问题原理

客户端访问服务端,服务端生成一个有限时间的cookie给客户端,cookie保存在客户端本地浏览器,下次进行访问的时候,客户端就会携带cookie访问服务端,服务端可以通过cookie辨别客户端用户


Cookie的使用

from django.shortcuts import render
from django.http import HttpResponse# Create your views here.# 体验了一下报错:The view createCookie_app.views.cookie_index didn't return an HttpResponse object. It returned None instead.
def cookie_index(request):return HttpResponse("设置cookie").set_cookie('name', 'root')# 先用这种
def cookie_index1(request):resp = HttpResponse("设置cookie")resp.set_cookie('name', 'root')return respdef cookie_get(request):print(request.COOKIES)return HttpResponse('获取cookie:%s' % request.COOKIES['name'])

Cookie的免登录设置

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect# Create your views here.
from django.urls import reversedef login(request):return render(request, 'login/login.html')def do_login(request):resp = HttpResponse()# 获取请求体数据data = request.POSTusername = data['uname']password = data['pwd']try:rember = data['rember']except:rember = '0'print('username:', username)print('password:', password)if username == 'django' and password == '123':resp.content = '登录成功'if rember == 'rember':print('设置cookie')# 设置cookieresp.set_cookie('uname', username, max_age=60*60*24*3)resp.set_cookie('pwd', password, max_age=60*60*24*3)else:# 删除cookieresp.delete_cookie('uname')resp.delete_cookie('pwd')return respelse:return HttpResponseRedirect(reverse('login'), {'msg': '用户名或密码错误'})
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h1>登录页面</h1>{% csrf_token %}<form action="/do_login/" method="post">{% csrf_token %}用户名:<input type="text" name="uname" ><br>密码:<input type="password" name="pwd" ><br>记住我<input type="checkbox" name="rember" value="rember"><br><input type="submit" value="登录"><br></form>
</body>
</html>
from django.urls import path
from .views import *urlpatterns = [path('login/', login, name='login'),path('do_login/', do_login, name='logout')
]

Session介绍

Session 对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而且在整个用户会话中一直存在下去。(session是依赖于cookie的)

Django框架中的session管理允许存储和检索任意数据,它在服务器端存储数据并抽象cookie的发送和接收。

启用session

要应用session,必须开启session中间层,在settings.py中:

MIDDLEWARE = [# 启用 Session 中间层'django.contrib.sessions.middleware.SessionMiddleware',
]
五种session的引擎

Django中默认支持Session,其内部提供了5种类型供开发者使用:

  • 数据库
  • 缓存
  • 缓存+数据库
  • 文件
  • Cookie

五种方式的启动配置各异,但是启动完成后,在程序中的使用方式都相同:

数据库方式

SESSION_ENGINE = 'django.contrib.sessions.backends.db'  
# 数据库类型的session引擎需要开启此应用,启用 sessions 应用
INSTALLED_APPS = ['django.contrib.sessions',
]

缓存

速度最快,但是由于数据是保存在内存中,所以不是持久性的,服务器重启或者内存满了就会丢失数据

SESSION_ENGINE = 'django.contrib.sessions.backends.cache' 

缓存+数据库

速度次于单纯缓存方式,但是实现了持久性,每次写入高速缓存也将写入数据库,并且如果数据尚未存在于缓存中,则使用数据库

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'  

一般用以上三种,另外两种少用,cookie不推荐使用

文件

SESSION_ENGINE = 'django.contrib.sessions.backends.file' 
# 设置文件位置, 默认是 tempfile.gettempdir(),
# linux下是:/tmp
# windows下是: C:\Users\51508\AppData\Local\Temp
SESSION_FILE_PATH = 'd:\session_dir'

加密cookie

基于cookie的session,所有数据都保存在cookie中,一般情况下不建议使用这种方式

  1. cookie有长度限制,4096个字节
  2. cookie不会因为服务端的注销而无效,那么可能造成攻击者使用已经登出的cookie模仿用户继续访问网站
  3. SECRET_KEY这个配置项绝对不能泄露,否则会让攻击者可以远程执行任意代码
  4. cookie过大,会影响用户访问速度
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

 Session的设置

django默认就会配置数据库存储session的设置,所以使用默认设置的时候需要配置好数据库信息

进行数据库的同步。数据库同步后会发现数据库中有一个django-session的表

之后进行设置的session将会存储在这张表内

创建与获取session

session = request.session# 配置session的时间
session.set_expiry(秒)# 设置session
session['uname'] = 'xxx'# 获取sessionuname = session.get('uname')

删除session

# 删除某个key
del request.session['has_commented']
# 从会话中删除当前会话数据并删除会话cookie
flush()
# 设置会话的到期时间
# 如果value是整数,则session将在多少秒不活动后到期
# 如果value是一个datetime或timedelta,该session将在相应的日期/时间到期
# 如果value是0,用户的会话cookie将在用户的Web浏览器关闭时到期
# 如果value是None,则会话将恢复为使用全局会话到期策略
set_expiry(value)


其他session方法

# 设置测试cookie以确定用户的浏览器是否支持cookie
set_test_cookie()
# 返回True或者False,取决于用户的浏览器是否接受测试cookie
test_cookie_worked()
# 删除测试cookie
delete_test_cookie()
# 返回此会话到期之前的秒数
# kwargs 为 `modification` 和 `expiry`,一般不指定
# modification:最后一次访问日期,默认当前时间, now
# expiry: 到期剩余秒数,默认全局配置时间
get_expiry_age(**kwargs)
# 返回此会话将过期的日期
# 参数同 get_expiry_age
get_expiry_date(**kwargs)
# 返回True或者False,取决于用户的Web浏览器关闭时用户的会话cookie是否会过期
get_expire_at_browser_close()
# 从会话存储中删除过期的会话,这是个类方法。
clear_expired()
# 在保留当前会话数据的同时创建新的会话密钥
cycle_key()
 

session的settings.py使用

# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_NAME = "sessionid" 
# Session的cookie保存的路径(默认)
SESSION_COOKIE_PATH = "/" 
# Session的cookie保存的域名(默认)
SESSION_COOKIE_DOMAIN = None
# 是否Https传输cookie(默认)
SESSION_COOKIE_SECURE = False
# 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_HTTPONLY = True
# Session的cookie失效日期(2周)(默认)
SESSION_COOKIE_AGE = 1209600
# 是否关闭浏览器使得Session过期(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# 是否每次请求都保存Session,默认修改之后才保存(默认)
SESSION_SAVE_EVERY_REQUEST = False  


session登录

使用了admin的后台管理系统

  • 用django后台管理的用户登录验证

  • 实现登录功能

    • django.contrib.auth

      • authenticate(): https://docs.djangoproject.com/zh-hans/4.1/topics/auth/default/#authenticating-users
      • login(): 使用 Django 的验证系统 | Django 文档 | Django
  • 实现退出用户功能

    • logout(): 使用 Django 的验证系统 | Django 文档 | Django
  • 没登录自动跳登录页面

    • django.contrib.auth.decorators.login_required实现
    • login_required() :使用 Django 的验证系统 | Django 文档 | Django

views.py

重定向还有模板jinja2语法好重要哟

from django.contrib import auth
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from django.views import View
from django.urls import reverse
from django.http import HttpResponseRedirect
# Create your views here.class m_login(View):def get(self, request):error_message = request.session.get('login_err')request.session['login_err'] = Nonereturn render(request, 'login.html', {'login_err':error_message})def post(self, request):username = request.POST.get('uname')password = request.POST.get('pwd')print(username)print(password)user = auth.authenticate(username=username, password=password)if user:login(request, user)  # login() 会在 session 中保存用户的ID。return render(request, 'index.html', {'name': username})# return render(request, 'index.html', {'name': username})else:request.session['login_err'] = '用户名或密码错误!'return redirect('session:login')def index(request):# 判断用户是否登录# 没有登录return HttpResponseRedirect(reverse('session:login'))

session登出

# 判断用户是否登录,# 没有登录,则跳转到登录页面
@login_required(login_url='session:login')
def index(request):# 有登录正常返回首页return HttpResponseRedirect(reverse('session:index'))# 退出登录
def logout(request):auth.logout(request)  # 清除session中的用户信息return HttpResponseRedirect(reverse('session:login'))

相关文章:

Django-cookie,session

Cookie简介 Cookie&#xff0c;有时也用Cookies&#xff0c;是指web程序为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据&#xff08;通常经过加密&#xff09;&#xff0c;一般是以键值对的形式存在&#xff0c;Cookie具有不可跨域名性 Cookie是http协议中…...

HarmonyOS开发 - 本地持久化之实现LocalStorage支持多实例

用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。数据存储形式为键值对&#xff0c;键的类型为字符串型&#xff0c;值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 在上一篇中&…...

【已解决,含泪总结】非root权限在服务器Ubuntu18.04上配置python和torch环境,代码最终成功训练(二)

配置torch环境 pip升级 因为一些包安装不成功可能和pip版本有关&#xff0c;所以先升级pip 吸取之前python有多个版本的经验&#xff0c;所以我指定了Python版本的pip进行升级 就是python3.8版本&#xff1a; /home/某某/Python3.8/bin/python3.8 &#xff08;要换成你实际的…...

Flutter鸿蒙next 刷新机制的高级使用【衍生详解】

✅近期推荐&#xff1a;求职神器 https://bbs.csdn.net/topics/619384540 &#x1f525;欢迎大家订阅系列专栏&#xff1a;flutter_鸿蒙next &#x1f4ac;淼学派语录&#xff1a;只有不断的否认自己和肯定自己&#xff0c;才能走出弯曲不平的泥泞路&#xff0c;因为平坦的大路…...

c/c++--静态变量和静态函数(static)

目录 1 c静态函数和静态变量 1.1 C静态成员函数&#xff1a; 1.1.1定义与基本语法 1.1.2 不依赖于实例 1.1.3 访问限制 1.1.4共享数据 1.1.5 作用域与命名 1.1.6 工厂函数和工厂方法&#xff08;常用途&#xff09; ​​​1.2 c静态函数&#xff08;) 1.3c静态变量 …...

Windows系统启动MongoDB报错无法连接服务器

文章目录 发现问题解决办法 发现问题 1&#xff09;、先是发现执行 mongo 命令&#xff0c;启动报错&#xff1a; error: MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017&#xff1b; 2&#xff09;、再检查 MongoDB 进程 tasklist | findstr mongo 发现没有进程&a…...

Linux的makefile与进度条小程序实践

makefile make命令主要功能使用方法常用选项 makefile文件基本结构使用案例变量定义内置变量(即系统定义的确定变量)伪目标模式规则条件语句注释makefile中的常用函数 进度条小程序创建文件编辑.h文件编辑.c文件创建main函数makefile文件执行效果 make命令 在linux中&#xff…...

latex写作基础

参考&#xff1a;https://www.bilibili.com/video/BV1ku4y1X7Rz 在线latex&#xff1a;https://cn.overleaf.com/ tex文件基本结构 \documentclass{article} % 文档类型&#xff0c;&#xff05;是注释\usepackage{graphicx} % 导入各种包&#xff0c;这里是graphicx包\titl…...

Chromium HTML5 新的 Input 类型email对应c++

一、Input 类型: email email 类型用于应该包含 e-mail 地址的输入域。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>test</title> </head> <body><form action"demo-form.php"…...

嵌入式Linux的AXI平台(platform)驱动教程

本文以JFMQL100的Linux系统的AXI接口的平台驱动为例&#xff0c;介绍嵌入式Linux的平台驱动编写、测试软件编写以及验证方式。本文的方法适用于任意嵌入式芯片Linux的物理地址映射的平台&#xff08;platform&#xff09;驱动的编写、测试与应用。 本文中AXI的开始地址为0x8000…...

什么是Java策略模式?与Spring的完美结合

文章目录 什么是策略模式&#xff1f;策略模式的组成部分&#xff1a; 策略模式的示例在Spring中的妙用1. 使用Spring配置2. 在上下文中选择策略3. 动态切换策略 总结推荐阅读文章 在软件设计中&#xff0c;策略模式是一种非常常见的设计模式&#xff0c;它能够让算法的变化独立…...

[Go实战]:HTTP请求转发

前言 在Web应用开发中&#xff0c;请求转发是一项核心且常见的功能&#xff0c;用于负载均衡、服务拆分、路由重定向和业务逻辑处理。通过在Go语言中封装一个通用的HTTP请求转发方法&#xff0c;我们可以简化代码结构&#xff0c;提升可读性、可维护性和可扩展性。本文将探讨如…...

【C++单调栈 贡献法】907. 子数组的最小值之和|1975

本文涉及的基础知识点 C单调栈 LeetCode907. 子数组的最小值之和 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff0c;因此 返回答案模 109 7 。 示例 1&#x…...

极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

Django 5 增删改查 小练习

1. 用命令创建目录和框架 django-admin startproject myapp cd myapp py manage.py startapp app md templates md static md media 2. Ai 生成代码 一、app/models.py from django.db import modelsclass Product(models.Model):name models.CharField(max_length255, verb…...

【STM32 Blue Pill编程实例】-I2C主从机通信(中断、DMA)

I2C主从机通信(中断、DMA) 文章目录 I2C主从机通信(中断、DMA)1、STM32的I2C介绍2、I2C模式3、STM32 I2C 数据包错误检查4、STM32 I2C 错误情况5、STM32 I2C中断6、STM32 I2C 主发送和接收(Tx 和 RX)6.1 I2C 轮询模式6.2 I2C 中断模式6.3 I2C DMA 模式6.4 STM32 I2C 设备…...

基于SSM+小程序的旅游社交登录管理系统(旅游4)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 本旅游社交小程序功能有管理员和用户。管理员有个人中心&#xff0c;用户管理&#xff0c;每日签到管理&#xff0c;景点推荐管理&#xff0c;景点分类管理&#xff0c;防疫查询管理&a…...

高级java每日一道面试题-2024年10月24日-JVM篇-说一下JVM有哪些垃圾回收器?

如果有遗漏,评论区告诉我进行补充 面试官: 说一下JVM有哪些垃圾回收器? 我回答: 1. Serial收集器 特点&#xff1a;Serial收集器是最古老、最稳定的收集器&#xff0c;它使用单个线程进行垃圾收集工作。在进行垃圾回收时&#xff0c;它会暂停所有用户线程&#xff0c;即St…...

Java-内部类

个人主页 学习内部类&#xff08;Inner Class&#xff09;是Java编程中一项重要且强大的特性&#xff0c;它允许你在一个类的内部定义另一个类。内部类提供了一种将逻辑上相关的类组织在一起的方式&#xff0c;增加了代码的封装性和可读性。接下来带领大家进入內部类的学习。 …...

flutter集成极光推送

一、简述 极光推送&#xff0c;英文简称 JPush&#xff0c;免费的第三方消息推送服务&#xff0c;官方也推出众多平台的SDK以及插件。 参考链接 名称地址客户端集成插件客户端集成插件 - 极光文档 二、操作步骤 2.1 添加插件 flutter项目中集成官方提供的 极光推送flutte…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...