心得:过年休息了一段时间终于又回到自己的学习进度上了,是时候慢慢的回到正轨了,新的一年希望自己好事多多。在这次的武汉疫情中,我相信我们国家的能力,从透明公开到逐一排查,我们都是相当自律,你很难想象14亿人口的健康状态普查,然后统计,在其他国家很难想象到有如此自律的公民吧,大家都心系健康,坚持走向成功,中国真正的显示出了一方有难八方支援的精神,很团结,希望在疫情过后,大家能更加有素质,有卫生的保护好自己,保护这个国家。
1. 什么是cookie
HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。
2. cookie的原理
cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
3.获取cookie,设置cookie和删除cookie
获取cookie
获取cookie的两种方法
request.COOKIES['key']
request.COOKIES.get('key')
设置cookie
rep = HttpResponse(...)
rep = render(request, ...)
rep.set_cookie(key,value,...)
参数:
key, 键
value=’’, 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn’t been already.)
path=’/’, Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
删除cookie
def logout(request):
rep = redirect("/login/")
rep.delete_cookie("user") # 删除用户浏览器上之前设置的user的cookie值
return rep
4.cookie的实例
1.我们通常见到的登录页面,采用的就是cookie,如果没有cookie的限制,我们每个网页都是相互独立,所以我们在登录之后,才给予相关网页的权限,这就需要cookie功能,先看以下没有cookie的代码,各个网页不相关。
#urls.py
from django.urls import path,re_path
from . import views
app_name = "front"
urlpatterns = [
path(r'index/',views.index,name='index'),
path(r'login/',views.login,name='login'),
]
#views.py
from django.shortcuts import render,HttpResponse,redirect,reverse
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
def index(request):
return HttpResponse("哈喽")
@csrf_exempt
def login(request):
if request.method == "POST":
user = request.POST.get('user')
password = request.POST.get('password')
# print(user,password)
if user == 'root' and password =='root':
return redirect(reverse('front:index'))
else:
return render(request,'login.html')
#login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>账号
<input type="text" name="user">
</p>
<p>密码
<input type="password" name="password">
</p>
<input type="submit">
</form>
</body>
</html>
2. Cookie版登录校验代码
urls.py
from django.urls import path,re_path
from . import views
app_name = "front"
urlpatterns = [
path(r'index/',views.index,name='index'),
path(r'login/',views.login,name='login'),
path(r'home/',views.home,name='home'),
path(r'logout/',views.logout,name='logout'),
]
views.py
from django.shortcuts import render,HttpResponse,redirect,reverse
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
#写成装饰器来修饰页面
def login_required(fn):
def inner(request,*args,**kwargs):
if not request.COOKIES.get('haha') == '1':
next=request.path_info
return redirect('/login/?next=%s'%next)
ret=fn(request,*args,**kwargs)
return ret
return inner
@login_required
def index(request):
return render(request,'index.html')
@login_required
def home(request):
return render(request,'home.html')
@csrf_exempt
def login(request):
if request.method == "POST":
user = request.POST.get('user')
password = request.POST.get('password')
# print(user,password)
if user == 'root' and password =='root':
next=request.GET.get('next')
#判断登录前的请求页面也多少,然后登录之后直接跳转过去
if next:
ret=redirect(next)
else:
ret = redirect(reverse('front:index'))
ret.set_cookie('haha','1')
return ret
else:
return render(request,'login.html')
#退出登录并删除本次cookie,删除cookie之后,登录记录会消失,退出登录
def logout(request):
ret = redirect(reverse('front:login'))
ret.delete_cookie('haha')
return ret
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<p>账号
<input type="text" name="user">
</p>
<p>密码
<input type="password" name="password">
</p>
<input type="submit">
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>home</title>
</head>
<body>
<h2>我是HOME</h2>
<a href="{% url 'front:logout' %}">注销</a>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h2>我是index</h2>
<a href="{% url 'front:logout' %}">注销</a>
</body>
</html>
5.Session的介绍
Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。
简而言之,服务器先给浏览器发送一个cookie,当浏览器访问数据库时,可以辨认此浏览器的信息,并可以在服务器上保存一段加密的信息。
获取设置删除:
# 获取
request.session['k1']
request.session.get('k1',None)
#设置
request.session['k1'] = 123 #常用
request.session.setdefault('k1',123) # 存在则不设置
#删除
del request.session['k1']
设置session
# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 会话session的key
request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")
# 删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
这用于确保前面的会话数据不可以再次被用户的浏览器访问
例如,django.contrib.auth.logout() 函数中就会调用它。
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
Session验证登录代码
from django.shortcuts import render,HttpResponse,redirect,reverse
from django.views.decorators.csrf import csrf_exempt
# Create your views here.
#写成装饰器来修饰页面
def login_required(fn):
def inner(request,*args,**kwargs):
if not request.session.get('haha') == '1':
next=request.path_info
return redirect('/login/?next=%s'%next)
ret=fn(request,*args,**kwargs)
return ret
return inner
@login_required
def index(request):
return render(request,'index.html')
@login_required
def home(request):
return render(request,'home.html')
@csrf_exempt
def login(request):
if request.method == "POST":
user = request.POST.get('user')
password = request.POST.get('password')
# print(user,password)
if user == 'root' and password =='root':
next=request.GET.get('next')
#判断登录前的请求页面也多少,然后登录之后直接跳转过去
if next:
ret=redirect(next)
else:
ret = redirect(reverse('front:index'))
request.session['haha']='1'
request.session.set_expiry(0)
return ret
else:
return render(request,'login.html')
#退出登录并删除本次cookie,删除cookie之后,登录记录会消失,退出登录
def logout(request):
request.session.flush()
ret = redirect(reverse('front:login'))
return ret