Django_cookie+session
一、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","123",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>
2、示例
urlpatterns = [ # path('admin/', admin.site.urls), path("cookie.html",views.cookie), path("session.html",views.session), path("index.html",views.index), ]
======================== 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","123",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")) # 123 print(json.loads(request.COOKIES.get("userinfo"))) # {'username': 'abc', 'nickname': '就要吃肉'} return render(request,"index.html")
<!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>
浏览器查看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存储的相关配置
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 == "123": # 结合数据库,这里只做简单比对 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")
from django.urls import path from app01 import views urlpatterns = [ path("login.html",views.login), path("index.html",views.index), ]
<!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>
<!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>
登出:
def logout(request): del request.session["userinfo"] request.session.delete("session_key") return redirect("/")
1)首次进入登录页面,填入账号密码并提交
2)服务器随机生成sessionid,一份存在数据库(或缓存、文件),一份发给浏览器
数据库的sessionid
浏览器上的sessionid
(3)登录成功后,带着sessionid去访问index.html