day45.forms组件其它+cookie和session
Posted lzl_121
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day45.forms组件其它+cookie和session相关的知识,希望对你有一定的参考价值。
forms组件展示提示信息
"""
使用forms组件渲染标签之后在获取用户数据的时候
浏览器会自动帮助我们校验数据
但是浏览器层面的数据校验弱不禁风没有实际意义
"""
# 如何取消浏览器自动校验数据的功能
<form action="" method="post" novalidate>
def login(request):
# 1.先生成一个对象
form_obj = MyForm()
# 3.判断请求方式
if request.method == \'POST\':
# 获取用户数据
# request.POST # 可以直接看成是一个字典
# 校验用户数据
# MyForm() # forms组件校验数据刚好需要传入一个字典
\'\'\'上述两步合一步\'\'\'
form_obj = MyForm(request.POST)
if form_obj.is_valid():
return HttpResponse(\'登录成功\')
# 2.将该对象传递给html页面
return render(request,\'login.html\',locals())
{% for form in form_obj %}
<p>
{{ form.label }}:{{ form }}
{{ form.errors.0 }}
</p>
{% endfor %}
forms组件常用参数
max_length 最大范围
min_length 最小范围
label 字段文本内容
required 字段是否必填 默认是True
error_messages 定义提示信息
widget 定义字段类型和属性
validators 额外的校验功能(一般都是正则)
initial 设置默认值
forms组件钩子函数
提供更加复杂的与业务相关的校验功能
钩子函数其实就在书写forms类的过程中定义方法
\'\'\'钩子函数都是在数据校验的最后一个环节执行\'\'\'
局部钩子(单个字段校验使用局部)
# 校验当前用户名是否已存在
def clean_username(self):
# 获取用户名
username = self.cleaned_data.get(\'username\')
# 查询数据库并判断
if username == \'jason\':
# 提示用户名已存在
self.add_error(\'username\',\'用户名已存在\')
return username
全局钩子(多个字段校验使用全局)
# 校验密码与确认密码是否一致
def clean(self):
# 获取密码 与 确认密码
password = self.cleaned_data.get(\'password\')
confirm_password = self.cleaned_data.get(\'confirm_password\')
if not password == confirm_password:
self.add_error(\'confirm_password\',\'两次密码不一致\')
return self.cleaned_data
forms组件其他字段补充
gender = forms.ChoiceField(
choices=((1, "男"), (2, "女"), (3, "保密")),
label="性别",
initial=3,
widget=forms.widgets.Radioselect()
)
hobby = forms.ChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=3,
widget=forms.widgets.Select()
)
hobby1 = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=[1, 3],
widget=forms.widgets.SelectMultiple()
)
keep = forms.ChoiceField(
label="是否记住密码",
initial="checked",
widget=forms.widgets.CheckboxInput()
)
hobby2 = forms.MultipleChoiceField(
choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
label="爱好",
initial=[1, 3],
widget=forms.widgets.CheckboxSelectMultiple()
)
forms组件源码
参考文件
cookie与session
HTTP协议四大特性
1.基于请求响应
2.基于TCP、IP作用于应用层之上
3.无连接
4.无状态
基于HTTP协议的通信无法记录客户端状态
但是现在很多软件都需要记录用户的状态 为了解决这个问题
发明了cookie session等一系列的技术
cookie
保存在客户端浏览器上面的键值对数据
"""
eg:当用户登录成功之后 浏览器保存用户的关键信息
以后访问的时候浏览器自动发送关键信息从而实现身份识别
关键型数据直接保存在浏览器上不安全
"""
session
保存在服务器上面的键值对数据(数据类型不固定)
"""
eg:当用户登录成功之后 服务端返回给浏览器一个随机字符串
之后访问都将随机字符串发送给服务端
服务端内部做比对
"""
# session需要依赖于cookie才可以工作
客户端浏览器可以保存服务端发送过来的cookie数据也可以选择拒绝
cookie操作
视图函数返回的HttpResponse对象
return HttpResponse()
return render()
return redirect()
...
obj = HttpResponse()
return obj
obj = render()
return obj
obj = redirect()
return obj
# 用户登录
设置cookie
obj = HttpResponse("登录成功")
obj.set_cookie(\'name\',\'jason\')
获取cookie
request.COOKIES.get(\'name\')
删除cookie
obj.delete_cookie("name")
session操作
session设置
request.session[\'name\'] = \'jason\'
"""
1.自动产生一个随机字符串
2.将随机字符串和数据存入django_session表中
3.将随机字符串返回给客户端浏览器保存
"""
session读取
request.session.get(\'name\')
"""
1.客户端请求中获取随机字符串
2.拿着随机字符串去django_session表中比对
3.如果比对成功获取对应的数据并且解析放到request.session中
"""
# django session默认的过期时间14d 可以人为修改
# 删除当前会话的所有Session数据
request.session.delete() # 只删客户端浏览器
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush() # 客户端浏览器和服务端都删
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
以上是关于day45.forms组件其它+cookie和session的主要内容,如果未能解决你的问题,请参考以下文章