###############    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. 哈希表hashTable的Java设计

    1:哈希表的概念 2:设计原理 3:哈希表的Java设计

  2. 直击JDD | 徐雷:智能化零售,以技术为驱动力的突破路径

    "京东零售已经成为一家典型的以技术驱动为主的零售公司".在11月19日召开的 2019京东全球科技探索者大会上,京东零售集团CEO徐雷首次阐释了京东零售的智能化零售路径. 徐雷指出 ...

  3. vi粘贴代码后格式混乱的问题

    最近在远程终端使用vi发现从其他地方复制代码的后,粘贴到vi里面出现格式变乱的问题. 主要是因为终端通常无法区分输入是来自用户输入还是来自粘贴,所以终端也不能通知 vim 输入来自何处.在 vim 里 ...

  4. HDU-2087 C - 剪花布条(KMP基本)

    http://acm.hdu.edu.cn/showproblem.php?pid=2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能 ...

  5. JAVA初学者——算数运算符

    Hello!大家好,我是浩宇大熊猫,又是学习java的一天,开开森森~ 运算符:也就是对常量或者变量进行操作的符号 表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式,不同的 ...

  6. 201312-2 ISBN号码 Java

    就是把-去掉,然后验证,只需要改最后一位. import java.util.Scanner; public class Main { public static void main(String[] ...

  7. Acunetix WVS安全测试软件使用教程(入门级)

    1.下载 Acunetix WVS 10.5软件,下载地址为:https://pan.baidu.com/s/1Koku0Lhya5PgphMVL7w19g 密码:v438 2.压缩包中有破解说明,按 ...

  8. vue 中使用print.js 打印遇到的问题 ?

    不管怎么设置打印部分的 margin和height 仍会在预览时多出一张空白页?求各位大佬遇到过的请留言谢谢!

  9. Activity组件(二):通过显式意图和隐式意图来跳转至第三方应用

    一.显式意图来跳转到第三方应用 /** * 这个方法会在点击按钮的时候执行 * @param view */ public void skip2Browser(View view){ Log.d(TA ...

  10. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十天】(单点登录系统实现)

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...