前言
HTTP请求是无状态的,一个客户端第一次,第二次…第n词访问同一个服务器都是一样的,服务器都会按照一个新的连接处理.但是,有时候客户端需要服务器记住客户端的登录状态.比如说,我离开了一会,回来之后,仍然要保持之前的登录状态.这个时候就需要用到cookie和session了.
一.cookie
cookie是服务器发送的保存在客户端的一个字符串,浏览器每次请求都会带上cookie.例如,在登录的时候,把用户名和密码保存在cookie中,只要cookie没过期,以后每次登录都可以自动登录,无需重复输入用户密码.
下面通过一个例子来看cookie如何使用:
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="/app01/login/" method="post">
<input type="text" name="username" placeholder="用户名">
<input type="password" name="pwd" placeholder="密码">
<input type="submit">
</form>
</body>
</html>
views.py中:
# 模拟数据库
user_info = {
'root':{'pwd':'123'},
'fan':{'pwd':'111'},
}
def login(request):
if request.method == "GET":
return render(request,'login.html')
if request.method == "POST":
username = request.POST.get('username')
pwd = request.POST.get('pwd')
dic = user_info.get(username)
if not dic:
return render(request,'login.html')
if dic['pwd'] == pwd:
res = redirect('/app01/index/')
res.set_cookie('username',username,max_age=5)
return res
else:
return render(request,'login.html')
def index(request):
# 获取当前已经登录的用户
v = request.COOKIES.get('username')
if not v:
return redirect('/app01/login/' )
return render(request,'index.html',{'current_user':v})
其中:
res.set_cookie('username',username,max_age=5)
是设置cookie,这里的res是一个render,HttpResponse或者redirect对象.
第一个参数是key,第二个参数是value,第三个参数是超时时间.
v = request.COOKIES.get('username')
这里是获取我们设置的cookie.
cookie的其他方法:
# request,COOKIES是一个字典
requst.COOKIES.get('username') # 可以这样获取字典的内容
# cookie设置内容
response = render(requst,'index.html') # 先创建一个render对象
# 或者是redirect对象也行
response.set_cookie('key','value') # set_cookie是设置值,也是一个字典,
# set_cookie有两个参数,第一个是key,第二个是vaule
# 这样设置是设置cookie,但是关闭浏览器后,cookie就失效了
# 当然了,还有其他参数.
response.set_cookie('key','value',max_age=10) #设置cookie,并且在10秒后失效
import datetime
current_time = datetime.datetime
response.set_cookie('key','value',max_age=10,expires=current_time)
#expires也是设置超时时间,但是这个的值是日期,而max_age是秒数
response.set_cookie('key', 'value', max_age=10, expires=current_time,path='/')
# path是设置cookie生效的路径,默认是'/',意思是所有的url都可以用,当然也可以自己设置
response.set_cookie('key', 'value', max_age=10, expires=current_time, path='/',domain='')
# domain:设置生效的域名
二.session
cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,
session则是解决了cookie的问题。session是保存在服务器端的一个大的字典,浏览器第一次访问服务器的时候,服务器把sessionid传到浏览器,然后浏览器把sessionid保存在lcookie中,每次访问时,带上这个标识,服务器就可以标识这个请求来自哪个用户。
在用session时,首先要在settings.py中配置session(默认配置好了):
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
在执行session之前,要执行数据库的两个命令:
python manager.py makemigrations
python manager.py migrate
这样做是因为session默认是将数据存在数据库中的.
接下来就是设置session以及使用session:
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def login(request):
if request.method == "GET":
return render(request,'login.html')
elif request.method == "POST":
user = request.POST.get('username')
pwd = request.POST.get('pwd')
if user == 'root' and pwd == '123':
# 生成随机字符串
# 写到用户浏览器cookie
# 保存到session中
# 在随机字符串对应的字典中设置相关内容
request.session['username'] = user # 这一句代码就干了上面的四步
request.session['is_login'] = True # 这一句代码就干了上面的四步
if request.POST.get('rmb',None) == '1':
# 人为设置超时时间
request.session.set_expiry(10) # 设置超时时间
return redirect('/app01/index/')
else:
return render(request, 'login.html')
def index(request):
# 获取当前用户的随机字符串
# 根据随机字符串获取对应信息
if request.session.get('is_login',None):
return render(request,'index.html',{'data':request.session['username']})
else:
return HttpResponse('滚!')
def logout(request):
# 首先清空session中的数据
request.session.clear()
return redirect('/app01/login/')
设置session时,要做以下四件事情:
- 生成随机字符串
- 写到用户浏览器cookie
- 保存到session中
- 在随机字符串对应的字典中设置相关内容
不过,在Django中,一句代码就搞定了:
request.session['username'] = user # 这一句代码就干了上面的四步
获取:
request.session.get('is_login',None)
清空:
request.session.clear()
当然,还有其他操作,这里就先不提了.
写在最后
本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.