• forms组件源码
切入点:form_obj.is_valid()
"""
def is_valid(self):"""Returns True if the form has no errors. Otherwise, False. If errors arebeing ignored, returns False."""return self.is_bound and not self.errors# 如果is_valid要返回True的话 那么self.is_bound要为True self.errors要为Flaseself.is_bound = data is not None or files is not None  # 只要你传值了肯定为True@property
def errors(self):"Returns an ErrorDict for the data provided for the form"if self._errors is None:self.full_clean()return self._errors# forms组件所有的功能基本都出自于该方法
def full_clean(self):self._clean_fields()  # 校验字段 + 局部钩子self._clean_form()  # 全局钩子self._post_clean()  

  • cookie与session
发展史1.网站都没有保存用户功能的需求 所有用户访问返回的结果都是一样的eg:新闻、博客、文章...2.出现了一些需要保存用户信息的网站eg:淘宝、支付宝、京东...以登陆功能为例:如果不保存用户登陆状态 也就意味着用户每次访问网站都需要重复的输入用户名和密码(你觉得这样的网站你还想用吗?)当用户第一次登陆成功之后 将用户的用户名密码返回给用户浏览器 让用户浏览器保存在本地,之后访问网站的时候浏览器自动将保存在浏览器上的用户名和密码发送给服务端,服务端获取之后自动验证早起这种方式具有非常大的安全隐患优化:当用户登陆成功之后,服务端产生一个随机字符串(在服务端保存数据,用kv键值对的形式),交由客户端浏览器保存随机字符串1:用户1相关信息随机字符串2:用户2相关信息随机字符串3:用户3相关信息之后访问服务端的时候,都带着该随机字符串,服务端去数据库中比对是否有对应的随机字符串从而获取到对应的用户信息但是如果你拿到了截获到了该随机字符串,那么你就可以冒充当前用户 其实还是有安

服务端保存在客户端浏览器上的信息都可以称之为cookie

它的表现形式一般都是k:v键值对(可以有多个)

session: 数据是保存在服务端的并且它的表现形式一般也是k:v键值对(可以有多个)

总结:

1.cookie就是保存在客户端浏览器上的信息

2.session就是保存在服务端上的信息

3.session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用到cookie)

  • Cookie操作
虽然cookie是服务端告诉客户端浏览器需要保存内容
# 但是客户端浏览器可以选择拒绝保存 如果禁止了 那么 只要是需要记录用户状态的网站登陆功能都无法使用了# 视图函数的返回值
return HttpResponse()
return render()
return redirect()obj1 = HttpResponse()
# 操作cookie
return obj1obj2 = render()
# 操作cookie
return obj2obj3 = redirect()
# 操作cookie
return obj3
# 如果你想要操作cookie,你就不得不利用obj对象"""
设置cookieobj.set_cookie(key,value)
获取cookierequest.COOKIES.get(key)
在设置cookie的时候可以添加一个超时时间obj.set_cookie('username', 'jason666',max_age=3,expires=3)max_ageexpires两者都是设置超时时间的 并且都是以秒为单位需要注意的是 针对IE浏览器需要使用expires
主动删除cookie(注销功能)"""
# 我们完成一个真正的登陆功能
# 校验用户是否登陆的装饰器
"""
用户如果在没有登陆的情况下想访问一个需要登陆的页面
那么先跳转到登陆页面 当用户输入正确的用户名和密码之后
应该跳转到用户之前想要访问的页面去 而不是直接写死
"""
def login_auth(func):def inner(request,*args,**kwargs):# print(request.path_info)# print(request.get_full_path())  # 能够获取到用户上一次想要访问的urltarget_url = request.get_full_path()if request.COOKIES.get('username'):return func(request,*args,**kwargs)else:return redirect('/login/?next=%s'%target_url)return innerdef login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == 'jason' and password == '123':# 获取用户上一次想要访问的urltarget_url = request.GET.get('next')  # 这个结果可能是Noneif target_url:obj = redirect(target_url)else:# 保存用户登陆状态obj = redirect('/home/')# 让浏览器记录cookie数据obj.set_cookie('username', 'jason666')"""浏览器不单单会帮你存而且后面每次访问你的时候还会带着它过来"""# 跳转到一个需要用户登陆之后才能看的页面return objreturn render(request,'login.html')@login_auth
def home(request):# 获取cookie信息 判断你有没有# if request.COOKIES.get('username') == 'jason666':#     return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")# # 没有登陆应该跳转到登陆页面# return redirect('/login/')return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")

  • session操作
session数据是保存在服务端的(存?),给客户端返回的是一个随机字符串
sessionid:随机字符串.在默认情况下操作session的时候需要django默认的一张django_session表数据库迁移命令django会自己创建很多表 django_session就是其中的一张

设置session
request.session['key'] = value获取session
request.session.get('key')设置过期时间     django默认session的过期时间是14天
request.session.set_expiry()括号内可以放四种类型的参数1.整数                       多少秒2.日期对象              到指定日期就失效3.0                              一旦当前浏览器窗口关闭立刻失效4.不写                     失效时间就取决于django内部全局session默认的失效时间清除session   request.session.delete()  # 只删服务端的 客户端的不删request.session.flush()  # 浏览器和服务端都清空(推荐使用)

session是保存在服务端的 但是session的保存位置可以有多种选择

        1.MySQL2.文件3.redis4.memcache

django_session表中的数据条数是取决于浏览器的

同一个计算机上(IP地址)同一个浏览器只会有一条数据生效

(当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除 你也可以通过代码清除)

主要是为了节省服务端数据库资源

request.session['hobby'] = 'girl'"""内部发送了那些事1.django内部会自动帮你生成一个随机字符串2.django内部自动将随机字符串和对应的数据存储到django_session表中2.1先在内存中产生操作数据的缓存2.2在响应结果django中间件的时候才真正的操作数据库3.将产生的随机字符串返回给客户端浏览器保存"""
request.session.get('hobby')"""内部发送了那些事1.自动从浏览器请求中获取sessionid对应的随机字符串2.拿着该随机字符串去django_session表中查找对应的数据3.如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中如果比对不上 则request.session.get()返回的是None

  • CBV如何添加装饰器

CBV(class base views) 就是在视图里使用类处理请求

CBV中django不建议你直接给类的方法加装饰器,需要使用一个模块method_decorator

from django.views import View
from django.utils.decorators import method_decorator# @method_decorator(login_auth,name='get')  # 方式2(可以添加多个针对不同的方法加不同的装饰器)
# @method_decorator(login_auth,name='post')
class MyLogin(View):@method_decorator(login_auth)  # 方式3:它会直接作用于当前类里面的所有的方法def dispatch(self, request, *args, **kwargs):return super().dispatch(request,*args,**kwargs)# @method_decorator(login_auth)  # 方式1:指名道姓def get(self,request):return HttpResponse("get请求")def post(self,request):return HttpResponse('post请求')

session保存密码_年薪百万之路--第六十四天 Cookie操作与session操作相关推荐

  1. create 执行存储过程报错出现符号_年薪百万之路--第四十天 存储引擎

    存储引擎 日常生活中文件格式有很多中,并且针对不同的文件格式会有对应不同存储方式和处理机制(txt,pdf,word,mp4...) 针对不同的数据应该有对应的不同的处理机制来存储 存储引擎就是不同的 ...

  2. jQuery 一次定时器_年薪百万之路--第五十一天 jQuery(上)

    原生js事件绑定 开关灯案例 <div id="d1" class="c1 bg_red bg_green"></div><but ...

  3. dict下如何取值_年薪百万之路--第十七天 装饰器(下)和迭代器

    一 有参装饰器 >带有参数的函数装饰器 为被装饰对象添加认证功能的装饰器,实现的基本形式如下 def deco(func):def wrapper(*args,**kwargs):编写基于文件的 ...

  4. python年薪百万_年薪百万之路--第二天:Python入门

    一.编程语言介绍 分类:机器语言(二进制) 执行效率高 计算机易理解 开发效率低 汇编语言 高级语言(编译型,解释型) 编译型----->Gcc编译器-------->机器语言 解释型-- ...

  5. Python之路【第十四篇】:AngularJS --暂无内容-待更新

    Python之路[第十四篇]:AngularJS --暂无内容-待更新 转载于:https://www.cnblogs.com/weiman3389/p/6224181.html

  6. 怎么知道 网站是否直接明文保存密码_忘记账号密码 浏览器记住了 怎么找回密码?...

    对于健忘又没有使用保存密码插件的习惯的人来说,忘记密码是经常的事情. 而大家知道的也就是通过网站的找回密码选项,通过邮箱,手机号,人工等方式找回密码,但是如果是个小网站,没有找回的功能,或者当时是随便 ...

  7. chrome 保存密码_如何在Chrome中管理保存的密码

    chrome 保存密码 Google Chrome comes with a handy password manager already built in. You can have your br ...

  8. python控制机器人走8字_爱,死亡和机器人 第十四集 齐马蓝 中文字幕(Python处理utf8文件获取想要的内容)...

    处理代码 file = "a.srt" fi = open(file, mode='r') a = fi.readline() i = 1 while len(str(a)) != ...

  9. java webservice报文过长_年薪百万IT大牛分享及(京东,阿里,58)Java初中高级765道面试题...

    一.数据结构与算法基础 说一下几种常见的排序算法和分别的复杂度. 用Java写一个冒泡排序算法 描述一下链式存储结构. 如何遍历一棵二叉树? 倒排一个LinkedList. 用Java写一个递归遍历目 ...

最新文章

  1. linux系统中ntp服务监听端口是,Linux系统下测试UDP端口是否正常监听的办法
  2. POJ - 1062 昂贵的聘礼
  3. ux的重要性_颜色在UX中的重要性
  4. 抖音右上角一个小黄点是什么_抖音官方入驻视频号,释放了一个什么样的信号?...
  5. C#LeetCode刷题-数学
  6. 云和恩墨技术通讯:Oracle AMM自动内存管理引起数据库阻塞
  7. Nginx配置单项SSL以及双向SSL
  8. JSonCpp库使用
  9. 局域网中的通信子网和资源子网
  10. “对赌协议”—八大失败经典案例
  11. 运营必备 - PV、UV、IP 分别是什么意思?
  12. 科学计算机度计算,科学计算器arctan
  13. 关于阴阳师日和坊的快速刷出方法以及相关思考
  14. 2018年银联红包领取方法
  15. 通过USGS批量下载Sentinel2数据
  16. lisp语言(转自百度)
  17. [总结]蓝牙各个版本的关系和区别
  18. 谢孟军:中国 Go 语言领军人创业第五年
  19. python微博爬虫实战_32个Python爬虫实战项目,满足你的项目荒,附赠资料
  20. 冯诺依曼结构计算机方案包含3个要点,冯诺依曼体系结构计算机的要点和工作过程.doc...

热门文章

  1. CentOS(RedHat)命令行永久修改IP地址、网关、DNS
  2. cisco最经典书籍 下载(全CCIE们的结晶)转载资料
  3. php取整函数ceil,floor,round,intval的区别
  4. 2019-2-15 日记
  5. 自定义AlertDialog控件的使用(AndroidStudio)
  6. Python全栈开发之2、运算符与基本数据结构
  7. DFS Codeforces Round #290 (Div. 2) B. Fox And Two Dots
  8. Cobar-Client 实现策略总结
  9. inno setup读取XML文件
  10. WindowsBatch与LinuxShell比较[变量符号和关键字]