django学习之- Cookie
cookie:客户端游览器上的一个文件,以键值对进行保存,类似字典{'k':'sfs'},与服务器端没有关系,当游览器访问服务器时候,服务器会
生成一个随机字符串保存在cookie中返回给客户端,这样当客户端游览器下次访问服务器端时候,会带着这个保存了服务器端的随机字符串的
cookie访问服务器,服务器端收到请求后,经过检查此cookie已存在此随机字符串,表示此客户端为已通过认证的状态,可以直接登录。
举例:
通过帐号登录服务器后,服务器端对cookie进行username标识,等客户端下一次访问时候,服务器端先提取cookie的username,如果不为空,表示为已登录帐号
def login(request)
u = request.POST.get('name')
# 对登录帐号进行验证,如果通过,执行下面
res = redirect('/index')
res.set_cookie('username',u)
return res 在index的函数直接提取当前登录的帐号是否匹配
def index(request)
#提取游览器中的cookie,如果不为空,表示为已登录帐号
v = request.COOKIES.get('username')
if not v:
return redirect('/login')
return render(request,'index.html',{'curr_name':v}
这时,页面使用{{curr_name}}可以直接获取登录帐号名称 游览器查看cookie的方法:这里的cookie可以通过游览器的“审查元素”-> "network" -> "Cookies" 看到 request.COOKIES:包含用户发来的所有数据,这个COOKIES就是一个字典,获取方法有以下2种
获取cookis,获取用户发来请求中的cookies
request.COOKIES['username111']
request.COOKIES.get('username111') 设置cookies,服务器端返回给客户端,并写入cookies
response = render(request,'index.html')
response = redirect('/index/')
# 设置cookie,关闭游览器自动失效
response.set_cookie('key','value')
return response
# 设置cookies超过10秒失效,写法
response.set_cookie('key','value',max_age=10)
# 从登录10秒后失效,写法
current_time = datetime.datetime.utcnow()
current_data = current_time + datetime.timedelta(seconds=10)
response.set_cookie('key','value',expires=current_data) rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密盐',...)
参数:
key, 键
value='', 值
max_age=None, 超时时间
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
domain=None, Cookie生效的域名
secure=False, https传输
httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) cookie 将字符串进行salt加解密,写法如下:
obj = HttpResponse('s')
obj.set_signed_cookie('username','jack',salt='adfadf') # 通过salt进行加密
request.get_signed_cookie('username',salt='adfadf') # 通过原来的salt进行解密 注意:获取cookies写法:request.COOKIES.get('名称') 设置cookies写法:response.set_cookie('key','value') 实例:userlist通过cookie实现页面显示数量
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分页</title>
<style>
.page {
background:#9acfea;
padding: 5px;
margin:5px;
}
.active{
background:red;
}
</style>
</head>
<body>
<ul>
{% for i in li %}
{% include 'li.html' %}
{% endfor %}
</ul>
{# {{ page_str|safe }}#}
<div style="float: left;">
<select id='ps' onchange="changePageSize(this);">
<option value="10">10</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</div>
<div style="float: left;">
{{ page_str }}
</div>
<script src="/static/jquery-1.12.4.min.js"></script>
<script src="/static/jquery-cookie/jquery.cookie.js"></script>
<script>
/*select选项框修改为当前显示数量*/
$(function () {
var v = $.cookie('per_page_count',{'path':"/ug/userlist"});
$('#ps').val(v)
});
/*select选项框选择后自动刷新页面*/
function changePageSize(ths) {
var v = $(ths).val();
$.cookie('per_page_count',v,{'path':"/ug/userlist"});
location.reload();
}
</script>
</body>
</html>
实例:FBV实现一个帐号登录后,保持10秒,并使用装饰器检查每个URL都为帐号登录状态
def auth(func):
''' 装饰器,检查当前游览器cookies里logname是否存在已登录的帐号,如果存在,则继续执行下面的函数,返回计划进入的url'''
def inner(request,*args,**kwargs):
v = request.COOKIES.get('logname')
if not v:
return redirect('/')
return func(request,*args,**kwargs)
return inner def login(request):
'''登录url '''
if request.method == 'GET':
return render(request,'login.html') def index(request):
if request.method == 'GET':
'''get模式,获取cookies的logname帐号名,如果为空则返回登录页面 '''
u = request.COOKIES.get('logname')
if not u:
return redirect('/')
if request.COOKIES['logname'] == 'admin':
alluser = models.UserName.objects.exclude(uname='admin')
else:
# loguser = request.session['username']
loguser = request.COOKIES['logname']
alluser = models.UserName.objects.filter(uname=loguser)
return render(request, 'index.html', {'u_list': alluser})
if request.method == 'POST':
'''帐号登录验证 '''
logname = request.POST.get('logname',None)
logpwd = request.POST.get('logpwd',None)
if models.UserName.objects.filter(uname=logname):
if models.UserName.objects.filter(uname=logname,upwd=logpwd):
# 登录验证成功,重写cookie的登录帐号,延时10秒
response = HttpResponse('ok')
response.set_cookie('logname',logname,max_age=10)
return response
else:
return HttpResponse('pwderr')
else:
return HttpResponse('nmerr') @auth # 装饰器,在访问url为account时候,验证帐号是否为登录状态
def account(request):
if request.method == 'GET':
return render(request,'account.html')
'
实例:CBV通过装饰器实现用户登录认证
from django import views
from django.utils.decorators import method_decorator
@method_decorator(auth,name='dispatch')
class Order(views.View):
def get(self,request):
v = request.COOKIES.get('logname')
return render(request,'index.html',{'current_user':v}) def post(self,request):
v = request.COOKIES.get('logname')
return render(request,'index.html',{'current_user':v})
django学习之- Cookie的更多相关文章
- Django学习之Cookie和Session
一.Cookie 1.Cookie的由来 2.什么是Cookie 3.Cookie的原理 4.查看Cookie 二.Django中操作Cookie 1.获取Cookie 2.设置Cookie 3.删除 ...
- Django学习手册 - cookie / session
cookie """ cookie属性: obj.set_cookie(key,value,....) obj.set_signed_cookie(key,value,s ...
- Django 学习之cookie与session
一.cookie和session的介绍 cookie不属于http协议范围,由于http协议无法保持状态,但实际情况,我们却又需要“保持状态”,因此cookie就是在这样一个场景下诞生. cookie ...
- Python学习---django下的cookie操作 180201
什么是Cookies 什么是Cookies cookies设置的原因: 1. http请求的无记忆性: 2.加快访问速度 3. 减少服务器压力 cookies特点: cookies保存在客户端浏览器 ...
- Django学习笔记(5)——cookie和session
一,前言 1.1,什么是会话跟踪技术 在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束.在一个会话的多个请求中共享数据,这就是会话跟踪技术. 例如在一 ...
- Django学习笔记之URL与视图cookie和session
cookie和session cookie:在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户.cookie的出现就是为了 ...
- Django学习笔记之Cookie、Session和自定义分页
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- Django学习目录
Django学习目录 Django框架简介 Django基础 >>点我 ORM介绍 Django中ORM介绍 >>点我 ORM表操作 Django中ORM表相关操作 >& ...
- Django学习笔记(9)—— 开发用户注册与登录系统
一,项目题目: 开发用户注册与登录系统 该项目主要练习使用Django开发一个用户注册与登录的系统,通过这个项目然后巩固自己这段时间所学习的Django知识. 二,项目需求: 开发一个简单的用户登录与 ...
随机推荐
- laravel核心思想
服务容器.依赖注入.门脸模式 服务容器 容器概念 用来装一个个实例的对象,比如邮件类. IOC控制反转 IOC(Inversion of Control)控制反转,面向对象,可降低代码之间的耦合度,借 ...
- Animate.css_css3动画库介绍
插件描述:Animate.css内置了很多典型的css3动画,兼容性好使用方便. Animate.css是一个有趣的,跨浏览器的css3动画库.很值得我们在项目中引用. 用法 1.首先引入animat ...
- (转)关于treap的板子理解
关于treap的板子理解: 关于结构体的定义:(一般平衡树无法理解的变量名):v:节点的值:size:子节点的个数(包括自己):cnt:相同的值的副本数:l:左儿子:r:右儿子: 右旋:父亲变成左儿子 ...
- 制作JPEGImages出现的bug
我用的是下面这个脚本进行改名字: import os import sys path = "/home/bnrc/py-faster-rcnn/data/VOCdevkit2007/VOC2 ...
- 暑假集训 || bitset
bitset是一个存储0和1的数组 可以快速的把两个bitset的每一位对应做与或啥的 在可以用01串表示某个状态的时候可以应用到它 就是有两个集合,求它们的交集 bitset <> a, ...
- zay大爷的膜你题 D2T1 江城唱晚
依旧是外链... 这一次网易云爆炸了....所以我决定后面的都用QQ 下面是题面 这道题是一道傻逼题 数学题,我们仔细看一看,首先有m朵花的话,我们就有m!种排列方式(也就是m的全排列), 然后我们假 ...
- 题解 洛谷P3622/BZOJ1151【[APIO2007]动物园】
这一道题,我也是搞了很久才搞懂的(也就两个多小时). 感谢Rayment大佬的题解! 我们进入正题. 对于一个笼子里的动物,我们可以选择撤走或不撤走,可以用0和1来表示,很容易就想到二进制,想到状压d ...
- nginx代理yum
适用场景:有多台服务器,但是只有1台服务器可以出公网,此时即可使用如下方式,进行yum代理,解决内网服务器不能yum的尴尬. 一.首先需要把/etc/yum.repos.d下的文件备份到bak,然后留 ...
- Beego:原生方式使用MySQL
示例: package controllers import ( "database/sql" "fmt" "github.com/astaxie/b ...
- HTML5结构
1.显示编排内容区域块(明确使用section等元素创建文档结构,在每个区域块中使用标题元素) 2.隐示编排内容区域块(不明确使用section等元素,而是根据网页需求来将各级的元素创建出来) 3.标 ...