cookie

cookie的由来

大家都知道Http协议是无状态的。

无状态的意思 是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系, 他不会受前面的请求响应情况直接影响, 也不会直接影响后面的请求响应情况。

对服务器来说, 每次的请求都是全新的。

状态可以理解为客户端和服务器在某次会话中产生的数据, 那无状态的就以为这些数据不会被保留。但是会话中产生的数据又需要我们保存的, 也就是说要保持状态, 因此Cookie就是在这样的一个场景下诞生。

什么是Cookie

Cookie具体指的是一段小信息,它是服务器发送的出来的存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对, 以便服务器提取有用信息。

cookie的原理

cookie 的工作原理是由服务器产生内容,浏览器收到请求后保存在本地, 当浏览器再次访问时,浏览器会自动带上Cookie, 这样服务器就能通过Cookie 的内容来判断这个是 “谁”了。

查看Cookie

我们使用Chrome 浏览器,打开开发者工具。

Django 中操作Cookie

获取Cookie

request.COOLIES["key"]
request.get_signed_cookie(key,default=RAISE_ERROR,SALT='',max_age=None)

参数:

default:默认值

salt:加密盐

max_age:后台控制过期时间

设置Cookie

rep = HttpResponse(...)
rep = render(request,...) 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

def logout(request):
rep = redirect("/login/")
rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值
return rep

Cookie版登录效验

def check_login(func):
@wraps(func)
def inner(request, *args, **kwargs):
next_url = request.get_full_path()
if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":
# 已经登录的用户...
return func(request, *args, **kwargs)
else:
# 没有登录的用户,跳转刚到登录页面
return redirect("/login/?next={}".format(next_url))
return inner def login(request):
if request.method == "POST":
username = request.POST.get("username")
passwd = request.POST.get("password")
if username == "xxx" and passwd == "dashabi":
next_url = request.GET.get("next")
if next_url and next_url != "/logout/":
response = redirect(next_url)
else:
response = redirect("/class_list/")
response.set_signed_cookie("login", "yes", salt="SSS")
return response
return render(request, "login.html")

Session

session 的由来

Cookie 虽然在一定程度上解决了“保持状态”的需求 但是由于Cookie本身最大的支持4096 字节, 以及Cookie 本身保存在客户端, 可能被拦截或窃取, 因此就需要有一种新的东西, 它能支持更多的字节, 并且他保存在服务器, 有较高的安全性, 这就是Session。

问题来了, 基于HTTP 协议的无状态特征, 服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到了桥接的作用。

我们可以给每个客户端Cookie 分配一个一个唯一的ID, 这样用户在访问时, 通过Cookie, 服务器就知道来的人是"谁"。然后我们在根据不同的Cookie的id, 在服务器上保存一段时间的私密资料, 如“账号密码”等等。

总结:Cookie弥补了HTTP 无状态的不足, 让服务器知道来的人是“谁”;但是Cookie 以文本的形式保存在本地, 自身安全性较差;所以我们就通过Cookie识别不同的用户, 对应的在Session 里保存私密的信息, 以及超过4096字节的文本。

另外,上述所说的Cookie 和Session其实是共通性的东西,  不限于语言和框架。

Django中Session 相关方法

# 获取,设置, 删除Seeion 中数据
request.session["k1"] #若是没有会报错
request.session.get("k1",None) #若是没有不会报错
request.session["k1"] =
request.session.setdefault("k1",) # 如是存在k1 的话,则不设置
del request.session["k1"] #所有键,值, 键值对
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.existes("session_key") 删除当前会话的所有的Session 数据是否存在
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流程解析图

session版登录验证

from functools import wraps
from django.shortcuts import redirect,render def check_login(func):
@wraps(func)
def inner(request, *args,**kwargs):
next_url = request.get_full_path()
if request.session.get("user"):
return func(request,*args,**kwargs)
else:
return redirect("/login/?next={}".format(next_url))
return inner def login(request):
if request.method == "POST":
user = requst.POST.get('user')
ped = request.POST.get("pwd") if user == "alex"and pwd == "ada123":
request.session["user"] = user
next_url = requs.GET.get("next")
if next_url:
return redirect(next_url)
else:
return redirect("/index/")
return render(request,"login.html") @check_login
def logout(request):
request.session.delete()
request.session.delete()
return redirect("/login/") @check_login
def index(request):
current_user = reques.session.get("user",None)
return render(request,"index.html",{"user":current_user})

Django 中Session 相关设置

CBV中加装饰器相关

class LoginView(View):
def get(self,request):
"""
处理GET 请求
:param request:
:return:
"""
return render(request,"login,html") def post(self,request):
"""
处理POST 请求
:param request:
:return:
"""
user = request.POST.get("user")
pwd = request.post.get("pwd")
if user == "alex" and ped == "alex1234":
next_url = request.GET.get("next")
request.session["user"] = user
if nest_url:
return redirect(next_url)
else:
return redirect("/index/") return render(request,"login.html")

CBV实现加装饰器相关

要在CBV视图中使用我们上面的check_login 装饰器, 有以下三种方式:

fromdjango.utils.decorators import method_decorator

1:加在 CBV 视图的get 或post 方法上

from django.utils.decorators import method_decorator

class HomeView(View):

    def dispatch(self,request,*args,**kwargs):
return super(HomeView,self).dispatch(request,*args,**kwargs) def get(self,request):
return render(request,"home.html") @method_decorator(check_login)
def post(self,request):
print("Home View POST method....")
return redirect("/index/")

2 :加在dispatch方法上

from django.utils.decorators import method_decorator

class HomeView(View):

    @method_decorator(check_login)
def dispatch(self,request,*args,**kwargs):
return super(HomeView,self).dispatch(request,*args,**kwargs) def get(self,request):
return render(request,"home.html") def post(self,request):
print("Home View POST method...")
return redirect("/index/")

因为在CBV中首先执行的就是dispacth方法, 所以这么写相当于get 和post 方法 都加上了登录效验。

3:直接加在视图类上, 但method_decorator 必须传name 关键字参数

如果get 方法和post 方法都需要登录校验的话就需要写两个装饰器

from django.utils.decorators import method_decorator

@method_decorator(check_login,name="get")
@method_decorator(check_login,name="post")
class HomeView(View): def dispacth(self,request,*args,**kwargs):
return super(HomeView,self).dispatch(request,*args,*kwargs) def get(self,request):
return render(request,"home.html") def post(self,request):
print("Home View POST method...")
return redirect("/index/")

补充

CSRF Token 相关装饰器, 在CBV 只能加到dispatch方法上

备注:

csrf_protect, 为当前函数强制设置防跨站请求伪造功能, 即便settings中没有设置全局中间件。

csrf_exempt,取消当前函数防跨站请求伪造功能, 即便settings中设置了全局中间件。

from django.views.decorators.csrf import csrf_exempt,csrf_protect

class HomeView(View):

    @method_decorator(csrf_exempt)
def dispacth(self,request,*args,**kwargs):
return super(HomeView,self).dispatch(request,*args,**kwargs) def get(self,request):
return render(request,"home.html") def post(self,request):
print("Home View POST method....")
return redirect("/index/")

cookie 、Session 和自定义分页的更多相关文章

  1. Cookie Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  2. Django Cookie Session和自定义分页

    Django中操作Cookie 获取Cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, ...

  3. Django的Cookie Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  4. Python学习(三十六)—— Cookie、Session和自定义分页

    一.Django中操作Cookie 获取Cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR ...

  5. Django框架详细介绍---cookie、session、自定义分页

    1.cookie 在HTTP协议介绍中提到,该协议是无状态的,也就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的 ...

  6. Cookie、Session和自定义分页

    一.cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响, ...

  7. Django - Cookie、Session、自定义分页和Django分页器

    2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie 服务端: 1. 生成字符串 2 ...

  8. Cookie、Session 和 自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  9. Django之Cookie、Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  10. Django学习笔记之Cookie、Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

随机推荐

  1. hadoop 学习笔记:mapreduce框架详解(转)

    原文:http://www.cnblogs.com/sharpxiajun/p/3151395.html(有删减) Mapreduce运行机制 下面我贴出几张图,这些图都是我在百度图片里找到的比较好的 ...

  2. MySQL存储过程入门教程

    存储过程介绍 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程可由应用程序通过一个调用来执行,而且 ...

  3. castle windsor学习----- Referencing types in XML 在xm文件中引用类型

    当从xml引用installer的语法如下 <install type="Acme.Crm.Infrastructure.ServicesInstaller, Acme.Crm.Inf ...

  4. DL一(ML基础知识)

    基础知识ML 在进行深度学习前,根据学习网站的建议,首先学习机器学习的基础课程,学习资料主要是Andrew讲的ShortVideo,网址:http://openclassroom.stanford.e ...

  5. iis常见问题解决

    iis7以上版本部署4.0框架项目常见问题解决 配置错误: 不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的 (overrideModeDefault=&quo ...

  6. Linux课程---4、Linux目录结构及常用命令(目录结构)

    Linux课程---4.Linux目录结构及常用命令(目录结构) 一.总结 一句话总结: 家目录:./root:root用户的家目录 能执行的程序:./bin:所有用户都能执行的程序:./sbin:只 ...

  7. Java企业微信开发_07_JSSDK多图上传

    一.本节要点 1.1可信域名 所有的JS接口只能在企业微信应用的可信域名下调用(包括子域名),可在企业微信的管理后台“我的应用”里设置应用可信域名.这个域名必须要通过ICP备案,不然jssdk会配置失 ...

  8. noip寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  9. [转]JavaScript文件操作(2)-FileReader

    在上篇文章中,我介绍了在JavaScript操作文件,重点讲了如何取得File对象. 这些对象包含的文件的元数据在上传或者拖放到浏览器中时可以获取到.有了文件当然接下来就是读取文件了. FileRea ...

  10. bzoj 4372 烁烁的游戏 —— 动态点分治+树状数组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 本以为和 bzoj3730 一样,可以直接双倍经验了: 但要注意一下,树状数组不能查询 ...