Cookie
1、获取Cookie
request.COOKIES.get("islogin",None) #如果有就获取,没有就默认为none
2、设置Cookie
obj = redirect("/index/")
obj.set_cookie("islogin",True) #设置cookie值,注意这里的参数,一个是键,一个是值
obj.set_cookie("haiyan","344",20) #20代表过期时间
obj.set_cookie("username", username)
return obj # 设置完毕后把该cookie返回
3、删除Cookie
obj.delete_cookie("cookie_key",path="/",domain=name)
Session
1、基本操作(需要掌握的)
1、设置session值
request.session["session_name"]="admin"
2、获取session值
session_name = request.session("session_name")
3、删除session值
del request.session["session_name"] 删除一组键值对
request.session.flush() 删除一条记录
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() 函数中就会调用它。
11 用户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失效策略。
Cookie、Session分析过程
代码
views.py
from django.http import HttpResponse
from django.shortcuts import render,redirect
from cookie_session.models import *
# Create your views here.
def login(request):
print('session',request.session)
print('cookie',request.COOKIES)
print('login-----session---username',request.session.get('username'))
print("haslogined",request.COOKIES.get('haslogined',None))
print("islogined",request.COOKIES.get('islogined',None))
if request.method == 'POST':
name = request.POST.get('user')
pwd = request.POST.get('pwd')
ret = User.objects.filter(name=name,pwd=pwd)
print('ret',ret)
if ret.exists():
# cookie_set = redirect("/cs/index/")
# cookie_set.set_cookie("username",name)
# cookie_set.set_cookie("pwd",pwd)
# cookie_set.set_cookie("haslogined",True)
# 设置session内部的字典内容,该部分内容会存入django_session数据库
request.session['islogined'] = True
request.session['username'] = name
return redirect("/cs/index/")
return render(request, "CS/login.html")
def index(request):
print('index------session', request.session)
print('index------cookie', request.COOKIES)
print("index-----islogined",request.session.get('islogined',False))
print('index-----session---username',request.session.get('username'))
if request.session.get('islogined',False):
# 获取字典的内容并传入页面文件
cookie_content = request.COOKIES
session_content = request.session
username = request.session['username']
return render(request, 'CS/index.html', locals())
return redirect("/cs/login/")
def logout(request):
try:
# del request.session['islogined']
request.session.flush() # 删除django-session表中的对应一行记录
except KeyError as e:
print('KeyError异常')
pass
return redirect('/cs/login/')
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% load staticfiles %}
<script src={% static "jquery-3.3.1.js" %}></script>
<title>Title</title>
<style>
* {
margin: 0;
padding: 0
}
</style>
</head>
<body>
<form action="/cs/login/" method="post"> {% csrf_token %}
<p>姓名<input type="text" name="user"></p>
<p>密码<input type="password" name="pwd"></p>
<p><input type="submit"></p>
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% load staticfiles %}
{# <script src="jquery-3.1.1.js"></script>#}
<script src={% static "jquery-3.3.1.js" %}></script>
<title>Title</title>
<style>
* {
margin: 0;
padding: 0
}
</style>
</head>
<body>
<h1>hello {{ username }}</h1>
<a href="/cs/logout/">注销</a>
</body>
</html>
过程分析
1.我们打开login登录界面,填写好用户名和密码,这个时候当我们点击提交
- 在login方法中首先验证用户名密码
- 验证通过,给服务端设置session并重定向
# 设置session内部的字典内容,该部分内容会存入django_session数据库
request.session['islogined'] = True
request.session['username'] = name
return redirect("/cs/index/")
这几步非常重要,Django会默认执行一下操作
1、创建随机字符串。假如s=“sdgsdfg4565dfgsdfgsdf”
2、 在django-session表中,添加一条记录
django-session有三个字段,分别是:session_key,session_data,expire_data
SQL: 语句: insert into django-session values (s,"{“IS_LOGON”:True,“USER”:egon}",12321)
3、给浏览器设置sessionID: obj.set_cookie(“sessionID”,s)
所有,重定向后会像数据库中添加一条Session记录,并向request.Cookie中添加一个sessionID字段(用于找到session记录),然后会将该Request传递给index方法或者直接返回给浏览器
然后进入到index方法
- 读取sesion中的字段值islogined
if request.session.get('islogined',False):
我猜测,这里Djano先是会根据传入过来的Cookie中的sessionID,找到Django-session表中对应的那一条Session记录
如果islogined没有在该条记录中,则不能通过重定向到login界面
通过islogined存在且为True,则通过验证,并从找到的sesion中取出username传递给浏览器
# 获取字典的内容并传入页面文件
cookie_content = request.COOKIES
session_content = request.session
username = request.session['username']
return render(request, 'CS/index.html', locals())
总结
重点是必须在登录成功后设置session的内容,然后重定向
然后在index方法中,验证上面所设置的内容信息,如islogined等