什么是cookie
不知道大家有没有遇到过这样一种情况,当我们通过账户名密码登录一些网站后,下次再打开该网站就不需要填写用户名和密码就直接是登录状态了。
聪明的小伙伴一定能够想到一定是有什么神奇的东东存储了登录所需要的相关信息,让我们再次登录网站时,由网站直接利用这个神奇的东东来验证我们是否登陆过,而这个就是我们这篇文章描写的主角——cookie
cookie在英文中的原意是甜饼,小饼干,但在这里它却不是一种食物,简单来讲,cookie是保存在浏览器端的键值对,可以用来存储用户登录的凭证,以及一些关于用户关于网页设置的相关信息。
好啦,介绍了这么多关于cookie文字描述,想必大家已经对cookie有了初步印象,但百闻不如一见,我们直接上代码,看看cookie在Django中是如何应用的吧!
1.cookie在Django中的简单应用
刚刚我们已经介绍了cookie可以在登录时可以保存一些关于用户登录的相关信息,那我们就做一个和登录相关的相关示例来帮助大家更好地理解cookie。
我们先创建一个login.html页面,并在views.py中创建一个login的视图函数,同时也不要忘记在urls.py创建好相关的路由。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="/login/">
<input type="text" name="username">
<input type="text" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
我们将用户名设置为a,密码设置为123,当密码正确则跳转到/menu/页面
#login视图函数,管理login.html页面
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
user = request.POST.get('username')
pwd = request.POST.get('password')
if user == 'a' and pwd == '123':
obj = redirect('/menu/')
return obj
else:
return render(request, 'login.html')
#menu页面的视图函数,访问则返回menu
def menu(request):
return HttpResponse('menu')
#在urls中添加如下的路由
path('menu/', views.menu, name='menu'),
path('login/', views.login, name='login'),
login该页面打开如下
这时我们还没有在login中添加相关cookie的设置,直接访问menu页面也是可以的,那么要如何使用cookie才能判断用户是否登陆成功过呢?
我们给login视图函数添加如下语句
obj.set_cookie('tickit','ok')
即视图函数为这样
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
user = request.POST.get('username')
pwd = request.POST.get('password')
if user == 'a' and pwd == '123':
obj = redirect('/menu/')
##########添加的语句如下##########
obj.set_cookie('tickit','ok')
#################################
return obj
else:
return render(request, 'login.html')
这样我们在用户名和密码登录正确后设置相关ticket,来证明用户登陆过,我们可以通过浏览器来检查添加的cookie。
既然添加了cookie,我们在menu视图函数处添加判断是否有ticket语句即可,获取ticket的语句为
request.COOKIES
修改后的menu视图函数如下,我们可以从打印结果看出成果获取了ticket
def menu(request):
###########判断是否有ticket的语句如下################
tk = request.COOKIES
#若没有ticket则返回login页面
print(tk)
#{'ticket': 'ok','csrftoken': 'cvijgUTIr63paiD1GVndw98QDGBcPCb63NL5cQePgTDV6QxSyLwqbeZaI5vVCaEC', 'sessionid': 'ii5my4h5ldx605oz3obak4kcdhrqj4ix'}
if not tk:
return redirect('login')
###################################################
return HttpResponse('menu')
以上就是cookie在Django中的简单应用,但cookie能做到的远不止这些,下面我将给大家讲解一些关于cookie更加复杂的应用。
2.cookie的高级应用
我们查看django中set_cookie()函数源码,可以发现其还有许多参数尚未被使用,下面我将根据这些参数,依次讲解cookie的高级用法
def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
domain=None, secure=False, httponly=False):
2.1 cookie的时间限制
在上面我们给大家介绍了关于网站登录的例子,但是这个例子还有后续,因为我们还会发现,过了一段时间,网站登录就会失效,我们需要重新输入密码进行认证,而这个认证失效,就是cookie的时间限制到了。
我们可以通过设置max_age来设置cookie的作用时效,其单位是秒
obj.set_cookie('ticket', 'ok', max_age=10)
同时,我们也可以设置expires设置cookie的到期时间,其原理和max_age是一样的,只不过传入的参数是datetime类型,UTC时间的字符串。
下面是一个使用expires的例子
import datetime
from datetime import timedelta
ct=datetime.datetime.utcnow()
v=timedelta(seconds=10)
value=ct+v
obj.set_cookie('ticket', 'ok', expires=value)
2.2 cookie的作用范围
set_cookie也可以通过path来设置cookie的作用范围,即使cookie在某些特定的url才能使用,下面是一个设置path的例子。
我们设置v1,v2两个页面,下面是其对应的视图函数
def v1(request):
obj = HttpResponse('v1')
obj.set_cookie('k1', 'v1')
return obj
def v2(request):
obj = HttpResponse('v2')
return obj
我们先访问v1页面,设置cookie,再访问v2页面,通过浏览器查看cookie,可见v2页面成功获取到了cookie。
我们将v1的视图函数更改如下,即将cookie的作用范围设置到v1页面本身,以刚刚同样的方法操作,由于未清除浏览器帮我们缓存的cookie,我们也需要将cookie的内容稍作修改。
def v1(request):
obj = HttpResponse('v1')
obj.set_cookie('hhhh', 'hhhh',path='/v1/')
return obj
我们可以清楚的看到set_cookie处已经有我们刚刚修改后设置的数据
我们再来看看v2页面,可以看到v2页面保留了第一次设置cookie的数据,但修改后的数据并没有显示
我们在后面还可以看到domain参数,这个参数是设置cookie的限定域名,默认是当前域名,其使用方法和path一样,这里我就不赘述了。
2.3 cookie的安全相关
最后set_cookie()的两个参数是和安全相关的两个参数,
def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
domain=None, secure=False, httponly=False):
secure是给https提供的功能,只有设置https的网站才需要设置,其用处超过了本文章的范围,就先不解释了。
httponly的意思是设置cookie只能通过http发请求时才能应用,当我们设置了此选项为true的时候,当我们设置了cookie,我们自己是无法查看的,只有当用该cookie发送http请求时才能使用
以上就是关于cookie在django中的大部分应用了,还有一个set_signed_cookie()未讲解,下篇文章我将会给大家继续讲解set_signed_cookie()。
创作不易,你的点赞和收藏是我继续写作的动力,如有错误麻烦再评论区留言,转载请标明出处,谢谢各位了!