###############    python基础回顾:装饰器    ################

# 装饰器非常重要,1是写代码的时候,2是面试的时候,没有python开发不问装饰器的,
# 装饰器绕不过去,一定会用到,不会装饰器不要说会python,
# 理解Python装饰器(Decorator)
# 想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。
# 闭包:
# 就是一个函数里面又套上另一个函数的定义,你反而要用的是内部函数,而且内部函数会用到外部函数的变量,这种方式我们就成为闭包,
# 我们把外部函数的变量和内部函数这个整体,我们称之为闭包, # 开放封闭原则:
# 写代码需要遵循开放封闭原则,简单来说就是,他规定已经实现的代码功能不允许被修改,但是可以被扩展,
# 封闭:已实现的功能
# 开放:对封闭的代码进行拓展开发,
# 为什么已经实现的代码不允许被修改?因为这个代码可能很多地方都用到了,你改动了会影响一大片,
# 所以使用装饰器,在不影响原有代码的基础上,动态的给函数加功能,但是要么在函数之前做事情,要么在函数之后做事情,不能在函数之中做事情 # 装饰器的应用:
# 可以用来计算程序执行的时间
# 可以用来做加验证,

下面使用装饰器的思想来实现登陆的校验功能:

###############    django-cookie的操作    ################

# cookie是什么?
# 举例说明,如果是登陆页面和首页页面
# 场景:用户登录,然后去访问首页,在访问首页的时候你怎么知道他有没有登录呢?
# cookie的由来,
# 因为HTTP请求是没有状态的,每一次请求都是独立的,你下次访问首页,我没有办法判断你是否登陆了
# cookie是什么?
# cookie就是保存在浏览器上的键值对,(不能说cookie就是做登陆的)
# 客户登陆之后,服务端会有一个响应,这个响应是浏览器拿到的,
# 你可以让浏览器收到响应之后在本地保存键值对,你只要不清除这个cookie,下一次请求的时候就会自动携带cookie值,
# 服务端就可以拿到这个键值对,就可以判断是否登陆了, # cookie的应用:
# cookie不只是能用来做登陆,可以做很多很多的事情,
# 1,可以做登, 7天免登录
# 2,记录用户的浏览器的习惯,
# 3,简单的投票限制,
# cookie是服务端设置的, 我们浏览器可以不让服务端设置记录cookie(可以禁用cookie,),
# 现在基本所有的网站登陆都要使用到cookie,
# cookie默认是关闭浏览器就失效了, # cookie的使用:
# 有很多页面都需要校验是否登陆,所以使用装饰器来做登陆的校验,
# 装饰器就是给函数动态的加功能
# cookie可能不够安全,因为当你使用cookie传递一些隐私信息的时候,可以通过抓包等工具截取到,
# 一般企业里面还是用的session多,

代码:

from django.shortcuts import render,redirect
from django.views.decorators.csrf import csrf_exempt, csrf_protect def check_cookie(func): # # 装饰器本身还是一个函数,func是把被装饰的函数做为参数传入,
print('进入装饰器') def wrapper(request,*args,**kwargs):
     # wrapper 有包装的意思,这个地方的作用是说,运行装饰器的时候需要做什么事情,里面的参数是被装饰函数的参数,由于不知道被调用参数的个数,使用不定长参数
# cookie_info=request.COOKIES.get('is_login')
cookie_info =request.get_signed_cookie('is_login',salt='SOS',default=0) # 没有获取到值会报错,所以需要一个default
print(cookie_info)
if cookie_info == '1':
return func(request,*args,**kwargs) # 这个返回值,就是去调用被装饰函数去了(携带不定长参数)
else:
return redirect('/login/')
return wrapper @csrf_exempt
def login(request):
if request.method=='POST':
user=request.POST.get('user')
pwd=request.POST.get('pwd')
if user=='liqian' and pwd =='123':
ret = redirect('/home/')
# ret.set_cookie('is_login',1) # 明文
ret.set_signed_cookie('is_login',value=1,salt='SOS',max_age=10) # 加密
return ret
return render(request,'login.html') # 调用装饰器使用@语法
@check_cookie
def home(request):
return render(request, 'home.html') def logout(request):
# 如何删除cookie
ret = redirect('/login/')
ret.delete_cookie('is_login')
return ret

###############    django-session的操作    ################

# session
# Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,
# 因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。
# session的格式是键值对,但是值是在服务端,
# 还需要cookie记录下来键在浏览器上,
# K1:{is_login: 1, user: xiaohei}
# K2:{is_login: 1, user: xiaowang}
# 这是session,
# session是依赖于cookie的,
# 所以需要定义一个cookie,存储值服务器:比如:XX:k1,
# 服务器拿到K1之后,然后在服务端查询就可以了,
#
# session是什么?
# 是保存在服务端的的键值对, # django中session做的事?
# qewrqerqe:{is_login: 1, user: xiaohei}
# werwewerwr:{is_login: 1, user: xiaowang}
# 存session
# 1,在服务端生成随机字符串,就是session的key
# 2,生成和上面的随机字符串对应的一个大字典,用来保存用户的信息,就是把session的key作为cookie键值对的值,
# 3,把随机字符串当成cookie返回给浏览器,sessionid:存在服务器端的session的key # 取session:
# 1,从请求携带的cookie里面找到随机字符串,
# 2,拿到随机字符串去session中找对应的大字典,
# 3,从大字典中根据key取值, # session的优势:
# 1,比cookie存的数据多
# 2,安全性好,数据都保持在服务端,
# session的缺点,
# 1,因为每一个人都需要一个session,像淘宝那样的,数据量比较大,会占用一些资源, # 设置会话Session和Cookie的超时时间
# request.session.set_expiry(value)
# *如果value是个整数,session会在些秒数后失效。
# *如果value是个datatime或timedelta,session就会在这个时间后失效。
# *如果value是0, 用户关闭浏览器session就会失效。
# *如果value是None, session会依赖全局session失效策略。
# 这个失效,是cookie失效,数据库里面的session数据还在
# 如果想要将所有Session失效日期小于当前日期的数据删除
# request.session.clear_expired()

代码:

from django.shortcuts import render,redirect
from django.views.decorators.csrf import csrf_exempt, csrf_protect def check_session(func):
print('进入装饰器')
def wrapper(request,*args,**kwargs):
session_info=request.session.get('is_login')
print(session_info)
if session_info=='':
return func(request,*args,**kwargs)
else:
return redirect('/login/')
return wrapper @csrf_exempt
def login(request):
if request.method=='POST':
user=request.POST.get('user')
pwd=request.POST.get('pwd')
if user=='liqian' and pwd =='':
ret = redirect('/home/')
request.session['is_login'] = ''
request.session.set_expiry(7) # 7秒失效,
# session数据是需要保持到数据库的,这个使用orm,django会自动创建的,django_session, 
# 一个浏览器请求会在数据库生成一个session,两个就会生成两个,不会覆盖,---
# session默认是存在数据库的,但是也是可以存在缓存中的,比如Redis缓存, 这个可以在setting中配置,
# 每一次和服务器交互会更新过期时间的,这样有交互过期时间就会延后,
return ret
return render(request,'login.html') @check_session
def home(request):
return render(request, 'home.html') def logout(request):
# 如何清除session
request.session.flush() # 这一步会删除session,并且cookie也删除了,
# request.session.delete() #这种只删除是session,这种cookie还在,但是是无效的,这种不常用,
return redirect('/login/')

################################################

################################################

################################################

django框架进阶-cookie和session-长期维护的更多相关文章

  1. django框架进阶-auth认证系统-长期维护

    ##################    django的认证系统     ####################### 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要 ...

  2. Django框架 之 Cookie、Session整理补充

    Django框架 之 Cookie.Session整理补充 浏览目录 Django实现的Cookie Django实现的Session 一.Django实现的Cookie 1.获取Cookie 1 2 ...

  3. Django框架 之 Cookie和Session初识

    Django框架 之 Cookie和Session初识 浏览目录 Cookie介绍 Django中的Cookie Session 一.Cookie介绍 1.Cookie产生的意义 众所周知,HTTP协 ...

  4. Django框架07 /cookie和session

    Django框架07 /cookie和session 目录 Django框架07 /cookie和session 1. django请求生命周期 2. cookie 3. session 4. 总结 ...

  5. Python 之 Django框架( Cookie和Session、Django中间件、AJAX、Django序列化)

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

  6. Django框架之cookie和session及开发登录功能

    1.cookie是什么? Web应用程序是使用HTTP协议传输数据的.HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接.这就意味着服务器无法从 ...

  7. 【python】-- Django 分页 、cookie、Session、CSRF

    Django  分页 .cookie.Session.CSRF 一.分页 分页功能在每个网站都是必要的,下面主要介绍两种分页方式: 1.Django内置分页 from django.shortcuts ...

  8. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  9. 第三百一十二节,Django框架,Cookie

    第三百一十二节,Django框架,Cookie 注意:获取Cookie是在请求对象里处理,设置Cookie是在响应对象里处理 普通Cookieset_cookie()设置普通cookie 参数: ke ...

随机推荐

  1. PES介绍(转载)

    PES: 1.1 PES介绍: PES--Packetized  Elementary Streams  (分组的ES),ES形成的分组称为PES分组,是用来传递ES的一种数据结构.PES流是ES流经 ...

  2. jupyter notebook 安装配置使用,+目录插件安装

    1.安装 pip3 install jupyter 2.配置 2.1. 生成一个 notebook 配置文件 jupyter notebook --generate-config /root/.jup ...

  3. 转:以下是目前已经建立的sub一览 来自:https://zhuanlan.zhihu.com/p/91935757

    转:以下是目前已经建立的sub一览  来自:https://zhuanlan.zhihu.com/p/91935757 作者: Lorgar 理工科 科学(和英文r/science一样,只接受论文讨论 ...

  4. Channels(纪念一下卡我心态的一道题)

    链接:https://ac.nowcoder.com/acm/contest/3947/C来源:牛客网 题目描述 Nancy喜欢学习,也喜欢看电视. 为了想了解她能看多长时间的节目,不妨假设节目从时刻 ...

  5. Constant expression required

    switch 语句编译报错Constant expression required 问题:case语句后面必须是常量,使用final修饰 public static final int NotifyT ...

  6. PAT甲级——1073 Scientific Notation (20分)

    Scientific notation is the way that scientists easily handle very large numbers or very small number ...

  7. Python基础学习五

    Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...

  8. flutter 命令卡主的问题

    情况 1 镜像的问题 如果你的镜像已经设置,却仍然卡主,那么请参考情况 2 这种情况在中文官网上已经有了,并且有这修改镜像的方法,附上链接: https://flutter.cn/community/ ...

  9. [Algo] 175. Decompress String II

    Given a string in compressed form, decompress it to the original string. The adjacent repeated chara ...

  10. SpringBoot项目启动之前操作,启动之后操作

    1.在Bean对象初始化之前可以做的操作 @Component public class InitBean implements BeanDefinitionRegistryPostProcessor ...