一、cookie和session介绍

cookie

  由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取。

  可在浏览器捕获明文cookie:csrftoken=NvUTqOiwD5nvxWxh8lhfy5Xx24pGoq7ebBePlJaIONiuxgzeeHgVb1KQnk3wIunM; key=value; mycookie=123;

session

  由于cookie会把所有的信息都保存在客户端,也就是浏览器上,这样会导致不安全,所以引用了session,但是只是单单的session也不好用,必须session和cookie配合这去用。

  session支持更多的字节,session会把信息保存在服务端。,有较高的安全性。

  服务器端随机生成一个字符串(sessionid),一份存在服务器,一份存在客户浏览器。见后面图。

二、cookie使用

1、用法

===================python===================
获取cookie
request.COOKIES.get("islogin",None) #如果有就获取,没有就默认为none 设置cookie
obj = redirect("/index/")
obj.set_cookie("key","value") #设置cookie值,注意这里的参数,一个是键,一个是值
obj.set_cookie("mycookie","",expires=60) #20代表过期时间 删除cookie
obj.delete_cookie("cookie_key",path="/",domain=None) ===================html===================
{#方法1,需进行后续切割处理#}
<script>
document.write(document.cookie)
</script> {#方法2#}
<script src="/static/plugins/jquery-3.3.1.js"></script>
<script src="/static/plugins/jquery.cookie.js"></script>
<script>
$.cookie("cookie_name") # 获取名为cookie_name的cookie,结果是明文字符串
$("body").append($.cookie('key')); // value
$("body").append($.cookie('mycookie')); // 123
$("body").append($.cookie('userinfo')); // {"username": "abc"\054 "nickname": "\u5c31\u8981\u5403\u8089"}
</script>

cookie用法

2、示例

urlpatterns = [
# path('admin/', admin.site.urls),
path("cookie.html",views.cookie),
path("session.html",views.session),
path("index.html",views.index),
]

urls.py

======================== views.py ========================

from django.shortcuts import render,redirect
import json def cookie(request):
print(request.COOKIES) # {'csrftoken': 'NvUTqOiwD5nvxWxh8lhfy5Xx24pGoq7ebBePlJaIONiuxgzeeHgVb1KQnk3wIunM', 'sessionid': '0hpm33x27gdvbs5kqhbzc37bentq20cb'}
obj = redirect("/index.html")
obj.set_cookie("key","value") # 参数分别是键、值、超时时间
obj.set_cookie("mycookie","",expires=60)
obj.set_cookie("userinfo",json.dumps({"username":"abc","nickname":"就要吃肉"})) # cookie只支持str
return obj def index(request):
print(request.COOKIES.get("key")) # value
print(request.COOKIES.get("mycookie")) #
print(json.loads(request.COOKIES.get("userinfo"))) # {'username': 'abc', 'nickname': '就要吃肉'}
return render(request,"index.html")

views.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>index页面</h1> {#方法1,需进行后续切割处理#}
<script>
document.write(document.cookie)
</script> {#方法2#}
<script src="/static/plugins/jquery-3.3.1.js"></script>
<script src="/static/plugins/jquery.cookie.js"></script>
<script>
$("body").append("<hr>");
$("body").append($.cookie('key')); // value
$("body").append("<hr>");
$("body").append($.cookie('mycookie')); // 123
$("body").append("<hr>");
$("body").append($.cookie('userinfo')); // {"username": "abc"\054 "nickname": "\u5c31\u8981\u5403\u8089"}
</script>
</body>
</html>

index.html

浏览器查看cookie

html页面显示结果

<script src="/static/plugins/jquery-3.3.1.js"></script>
<script src="/static/plugins/jquery.cookie.js"></script>
$.cookie('key')

三、session使用

1、用法

使用方法

1、设置session值
    request.session["session_name"]="admin"
2、获取session值
    session_name = request.session.get("session_name")
3、删除session值
    del request.session["session_name"] 删除一组键值对
    request.session.flush() 删除一条记录,删除会话的Cookie
4、检测是否操作session值
    if "session_name" is request.session: 5、get(key, default=None) fav_color = request.session.get('fav_color', 'red') 6、pop(key) fav_color = request.session.pop('fav_color') 7、keys() 8、items() 9、setdefault() 10、flush() 删除当前的会话数据并删除会话的Cookie。
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout() 函数中就会调用它。
用户session的随机字符串
request.session.session_key # 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key") # 删除当前用户的所有Session数据
request.session.delete("session_key") request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。 session用法

session用法

session存储的相关配置

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

a. 配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

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

默认的是数据库配置

setting.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

缓存配置

SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

文件配置

2、实验:登录、登出

登录:

from django.shortcuts import render,redirect, HttpResponse
import json def login(request):
if request.method == "GET":
return render(request,"login.html")
else:
username = request.POST.get("username")
password = request.POST.get("password")
if username == "abc" and password == "": # 结合数据库,这里只做简单比对
request.session["islogin"] = True
request.session["userinfo"] = {"username":username}
request.session["for_flush"] = "flush"
return redirect("/index.html")
else:
return HttpResponse("账号或密码错误") def index(request):
print(request.session.session_key)
print(request.session.get("islogin")) # True
print(request.session.get("userinfo")) # {'username': 'abc'}
print(request.session.get("for_flush")) # flush # 删除for_flush字段
del request.session["for_flush"] # 删除服务器端session的某个字段
# request.session.flush() # 删除该用户浏览器上所有session数据 if request.session.get("islogin"):
return render(request,"index.html")
else:
return redirect("/login.html")

views.py

from django.urls import path
from app01 import views urlpatterns = [
path("login.html",views.login),
path("index.html",views.index),
]

urls.py

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="POST" action="">
{% csrf_token %}
<p>用户名 <input type="text" name="username"></p>
<p>密码 <input type="password" name="password"></p>
<p><input type="submit"></p>
</form> </body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>index页面</h1>
<h2>欢迎登录,{{ request.session.userinfo.username }}</h2> </body>
</html>

index.html

登出:

def logout(request):
del request.session["userinfo"]
request.session.delete("session_key")
return redirect("/")

views.py

1)首次进入登录页面,填入账号密码并提交

2)服务器随机生成sessionid,一份存在数据库(或缓存、文件),一份发给浏览器

数据库的sessionid

浏览器上的sessionid

(3)登录成功后,带着sessionid去访问index.html

Django_cookie+session的更多相关文章

  1. 9.Django组件-cookie和session

    HTTP协议的无保存状态,对两次请求没有任何关联.每次请求都是相互独立的. 1.cookie简介 什么是会话跟踪技术我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会 ...

  2. day55:django:cookie&session

    目录 1.Cookie 1.Cookie前戏 2.Cookie的引入 3.django中操作cookie 2.Session 1.cookie的局限性 2.session技术 3.django操作se ...

  3. session实现购物车

    为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...

  4. Asp.net Core中使用Session

    前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...

  5. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  6. 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  7. Nhibernate的Session管理

    参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...

  8. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  9. zookeeper源码分析之六session机制

    zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...

随机推荐

  1. JS 兼容大全

    //获取浏览器可视区宽度 function getWidth() { if (window.innerWidth){ return window.innerWidth; } else{ if (doc ...

  2. c++——引用

    1 引用概念 a)         在C++中新增加了引用的概念 b)         引用可以看作一个已定义变量的别名 c)         引用的语法:Type& name = var; ...

  3. HBase--大数据系统的数据库方案

    本文主要围绕以下三方面来讨论HBase:是什么.为什么.怎样做. 1. 什么是HBase HBase是一个开源的.分布式的.非关系型数据库,其设计思想来源于Google的Big Table.通过集群管 ...

  4. Truck History(prime)

    Truck History Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31871   Accepted: 12427 D ...

  5. Rust 智能指针(一)

    Rust 智能指针(一) 1.Box<T> Box<T>是指向堆中的指针. fn main() { let box = Box::new(3); println!(" ...

  6. SSM-CRUD入门项目——环境搭建

    一.项目概述 项目功能点: 1.分页 2.数据校验: jQuery前端校验+JSR303后端校验 3.ajax 4.RESTful风格的URI 技术点: 1.基础框架——SSM 2.数据库——MySQ ...

  7. 【转】比较详细的Asp伪静态化方法及Asp静态化探讨

    目前,各大搜索引擎如google.百度.雅虎已经对动态页面诸如asp,php有着不错的支持了,只要动态页面后面的参数不要太长,如控制在3个参数内,页面内容做点优化,各大搜索对该类页面收录甚至不比静态h ...

  8. Visual Studio 2010 Express for Windows Phone 永久免费序列号

    Visual Studio 2010 Express for Windows Phone 永久免费序列号:YDK44-2WW9W-QV7PM-8P8G8-FTYDF

  9. Linux命令学习笔记2(mysql安装和mysql-python安装)

    linux下 强制安装 rpm安装包(切换到root用户):  rpm -ivh bluefish-shared-data-2.2.7-1.el6.noarch.rpm --nodeps --forc ...

  10. [Windows]_[中级]_[崩溃报告的中级解决方案]

    场景 1.在Windows上用C/C++开发软件, 经常会出现软件级别的崩溃情况, 如果用户看到这种崩溃报告, 那么一般会认为软件质量不高, 从而不想用. Windows上就会有崩溃报告这种噢给你工具 ...