Django之form表单组件、cookie与session

---恢复内容开始---

Form表单组件

引例:

先来看一个注册的例子,全部用的是reg函数来实现的。

views.py文件

def reg(request):errors = {'username':'','password':''}if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if 'sb' in username:errors['username'] = '用户名里面不能有sb,你这个dsb'if password == '123':errors['password'] = '密码太简单了,你怕是个傻子哦'return render(request,'reg.html',locals())

reg.html文件

<h1>注册页面</h1>
<form action="" method="post"><p>username:<input type="text" name="username"><span>{{ errors.username }}</span></p><p>password:<input type="password" name="password"><span>{{ errors.password }}</span></p><input type="submit"></form>

这里我们定义了一个errors的字典来对input框内容进行限制

其实form常用字段和插件就可以做到

常用字段与插件

initial:初始值,input框里面的初始值。

error_messages:重写错误信息。

views.py文件

from app01 import models
from django import forms
from django.forms import widgets

class MyForm(forms.Form):name = forms.CharField(max_length=6,label='用户名',error_messages={'max_length':'用户名最长6位','required':'用户名不能为空'})password = forms.CharField(max_length=8,min_length=3,error_messages={'max_length': '密码最长8位','required': '密码不能为空','min_length':'密码最少3位'},widget=widgets.PasswordInput(attrs={'class':'c1 form-control'}))confirm_password = forms.CharField(max_length=8, min_length=3, error_messages={'max_length': '确认密码最长8位','required': '确认密码不能为空','min_length': '确认密码最少3位'},widget=widgets.PasswordInput())email = forms.EmailField(error_messages={'invalid':'邮箱格式不正确','required':'邮箱不能为空'})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())# 钩子函数# 局部钩子函数 (单个字段的校验利用局部钩子函数)def clean_name(self):name = self.cleaned_data.get('name')if '666' in name:self.add_error('name','光喊666是不行的,要有真实力!')return name # return还是要加上的,兼容性考虑# 全局钩子函数 (多个字段的校验利用全局钩子函数)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',"两次密码不一致,你这个dsb!")return self.cleaned_datadef reg(request):# 生成一个空对象form_obj = MyForm()if request.method == 'POST':print(request.POST)form_obj = MyForm(request.POST)if form_obj.is_valid():print(form_obj.cleaned_data)models.User.objects.create(**form_obj.cleaned_data)return render(request,'reg.html',locals())

这里我们定义了一个类来帮助我们实现对form表单输入框的判断功能

models.py文件

class User(models.Model):name = models.CharField(max_length=32)password = models.CharField(max_length=32)email = models.EmailField()

这里只对表里面的字段进行校验,后端数据又是如何渲染到前端的呢?

渲染到前端的三种方法:

一:reg.html文件

<h1>第一种渲染方式(可扩展性较差)</h1>
{{ form_obj.as_p }}
{{ form_obj.as_ul }}

用的是已经封装好的 直接拿表的字段来显示as_‘’标签‘’就是用这种标签来包裹

 

二:

<h1>第二种渲染方式</h1>
<form action=""><p>{{ form_obj.name.label }}{{ form_obj.name }}</p><p>{{ form_obj.password.label }}{{ form_obj.password }}</p><p>{{ form_obj.email.label }}{{ form_obj.email }}</p><input type="submit">
</form>

三:

<h1>第三种渲染标签的方式</h1>
<form action="" method="post" novalidate>{% for foo in form_obj %}<p>{{ foo.label }}{{ foo }}</p><span>{{ foo.errors.0 }}</span>{% endfor %}<input type="submit">
</form></body>
</html>

这里推荐是使用第三种,简洁还可以扩展

 

cookie与session

http协议四大特性
1.基于TCP/IP作用于应用层的协议
2.基于请求响应
3.无状态
4.无连接

cookie:存放在客户端的键值对

cookie与session正好弥补了HTTP协议的不足

设置cookie
obj.set_cookie() # 给浏览器设置cookie

获取cookie
request.COOKIE.get('name')
request.COOKIE['name']

session:

保存在服务端上的键值对
服务端产生随机的字符串返回给客户端,服务端将字符串与对应的信息存起来{'随机字符串':'敏感信息'}。

设置session

request.session['name'] = 'jason'

1.先生成一个随机的字符串

2.在django session表中存储该随机字符串与数据的记录

3.将随机的字符串发送给客户端浏览器

 

获取session

request.session.get('name')

1.django自动获取浏览器随机字符串取django session表里面比对

2.如果比对成功 会将当前随机字符串对应的数据赋值给request.session

        3.通过request.session操作该数据(数据不存在也不会影响我们的业务逻辑)

 

浏览器会设置一个键为sessionid来存放session值

 删除当前会话的所有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

def login(request):if request.method == 'POST':username = request.POST.get('username')password = request.POST.get('password')if username == 'khan' and password == '123':old_path = request.GET.get('next')if old_path:obj = redirect(old_path)else:obj = redirect('/home/')# 用户登录成功 朝浏览器设置一个cookie# obj.set_cookie('name','khan',expires=7*24*3600)obj.set_cookie('name','khan',max_age=5)return objreturn render(request,'login.html')from functools import wraps
def login_auth(func):@wraps(func)def inner(request,*args,**kwargs):# 校验cookie# print(request.get_full_path())old_path = request.get_full_path()if request.COOKIES.get('name'):return func(request,*args,**kwargs)return redirect('/login/?next=%s'%old_path)return inner@login_auth
def index(request):# # print(request.COOKIES.get('name'))# if request.COOKIES.get('name'):return HttpResponse('我是index页面,只有登录了才能看')@login_auth
def home(request):return HttpResponse('我是home页面,只有登录了才能看')@login_auth
def xxx(request):return HttpResponse('我是xxx页面,只有登录了才能看')def set_session(request):request.session['name'] = 'khan'request.session['name1'] = 'egon'request.session['name2'] = 'tank'request.session['name3'] = 'nick'request.session['name4'] = 'sean'return HttpResponse('ok')def get_session(request):print(request.session.get('name'))print(request.session.get('name1'))print(request.session.get('name2'))print(request.session.get('name3'))print(request.session.get('name4'))return HttpResponse('ok')def delete_session(request):request.session.delete()return HttpResponse('ok')def flush_session(request):request.session.flush()return HttpResponse('ok')

login.html文件

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script><link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css"><script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post"><p>username:<input type="text" name="username"></p><p>password:<input type="text" name="password"></p><input type="submit">
</form>
</body>
</html>

 

 

 

 

---恢复内容结束---

转载于:https://www.cnblogs.com/guanlei/p/11042560.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员经验分享:Android高级工程师系列学习路线介绍,面试必备

前言 曾听过很多人说Android学习很简单&#xff0c;做个App就上手了&#xff0c;工作机会多&#xff0c;毕业后也比较容易找工作。这种观点可能是很多Android开发者最开始入行的原因之一。 在工作初期&#xff0c;工作主要是按照业务需求实现App页面的功能&#xff0c;按照设…

Java实现将文件或者文件夹压缩成zip

Java实现将文件或者文件夹压缩成zip 最近碰到个需要下载zip压缩包的需求&#xff0c;于是我在网上找了下别人写好的zip工具类。但找了好多篇博客&#xff0c;总是发现有bug。因此就自己来写了个工具类。 这个工具类的功能为&#xff1a; &#xff08;1&#xff09;可以压缩文件…

算法题+JVM+自定义View,隔壁都馋哭了

反思 昨晚去北京大望路阿里面试, 产生了严重的挫败感, 羞愧难当. 比不得从大学就有目标有理想, 一直在为目标努力学习技术的同学, 在大学唯一能拿得出手的就是参加了电子设计大赛, 学了点嵌入式的知识. 毕业后开始做android, 说得好听点叫做项目, 实际上就是搬代码, 真正记到…

n2n内网穿透打洞部署全过程 + nginx公网端口映射

内网穿透、打洞工具有很多&#xff0c;此前在windows上使用的是vidcc这个玩意&#xff0c;也正因为linux不支持。自此在linux尝试过一些打洞工具&#xff0c;ssh 反向代理这些&#xff0c;因为安全性不便捷等多种原因&#xff0c;最终选择了n2n。 由于初次接触n2n&#xff0c;对…

Windows下快速删除上万个文件和子目录

为什么会慢 如果直接在Windows文件管理器里删除的话&#xff08;通过菜单或者键盘Del或者ShiftDel&#xff09;&#xff0c;删除这个数量的文件需要大概10几分钟&#xff0c;具体根据文件数量目录层次不同耗时不同。这么慢是因为在删除之前系统有个准备阶段&#xff0c;在这个阶…

终于有人把安卓程序员必学知识点全整理出来了,BAT大厂面试总结

行业激烈变化时&#xff0c;恰恰是机会最多的时候 坦白讲&#xff0c;许多人骨子里害怕变化和竞争。 其实大可不必。 一来&#xff0c;怕也没用嘛。二来&#xff0c;变化越快&#xff0c;组合要素增加了&#xff0c;意味着新的工作机会越多。 就像传统媒体VS新媒体。 放在…

c#反混淆工具de4dot 一般混淆都可以解决

c#反混淆工具de4dot 一般混淆都可以解决 使用方法&#xff1a; 1、CMD 打开 De4Dot 所在文件夹 最好是以管理员身份运行CMD 2、输入 De4Dot C:\Users\muzigaiyu\Desktop\demo.exe 回车 成功后会在软件所在文件夹生成 demo-cleaned.exe 在用dotpeek 或者其他软件打开exe即可看…

餐厅点餐系统:测试与部署

项目测试与部署 1.系统测试 项目调试完成后&#xff0c;将项目打包成war包放入tomcat/wabapps文件夹&#xff0c;本机启动tomcat&#xff0c;redis缓存&#xff0c;mysql数据库等服务&#xff0c;本机访问localhost&#xff1a;8080/BookFood&#xff0c;测试系统的各个功能是否…

SpringCloud与Seata分布式事务初体验

在本篇文章中我们在SpringCloud环境下通过使用Seata来模拟用户购买商品时由于用户余额不足导致本次订单提交失败&#xff0c;来验证下在MySQL数据库内事务是否会回滚。 本章文章只涉及所需要测试的服务列表以及Seata配置部分。 用户提交订单购买商品大致分为以下几个步骤&…

想学IT的必看!今年Android面试必问的这些技术面,架构师必备技能

第一次观看我文章的朋友&#xff0c;可以关注、点赞、转发一下&#xff0c;每天分享各种干货技术和程序猿趣事 前言 职场的金三银四跳槽季又来了&#xff0c;不同的是今年比往年「冷」一些&#xff0c;形式更加严峻一些&#xff0c;大家多多少少可能都听到或看到一些信息&…

springboot集成redis使用redis作为session报错ClassNotFoundException类RememberMeServices

springboot 集成redis使用redis作为缓存&#xff0c;会报错的问题。 错误信息&#xff1a; java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration.taskSchedulerat org.springframew…

阿里巴巴分布式事务利器Seata环境准备

阿里巴巴自从跟SpringCloud共同发起创建微服务开源社区时&#xff0c;开启了SpringCloud Alibaba分支&#xff0c;而且在生态内提供了一款适用于分布式应用程序&#xff08;Dubbo、SpringCloud等&#xff09;的事务框架Seata&#xff0c;该框架经过多个大版本的发布&#xff0c…

对于‘敲什么都队’自主开发的《校园服务》软件的使用体验

信1805-1 边信哲 20183694 在六月十三日我系组织的2017级软件工程交流大会中&#xff0c;我为第十一组敲什么都队’自主开发的《校园服务》软件投出了我的一票&#xff0c;在为数众多的校园服务类软件中&#xff0c;《校园服务》最吸引我的地方就是他们的软件能完成数据…

阿里P7大牛亲自教你!BAT这种大厂履历意味着什么?积累总结

金九银十过后各大网络平台都是各种面经分享&#xff0c;包括已收offer&#xff0c;或面试失败的都有&#xff0c;相信大部分人都拿到了自己心仪的大厂offer&#xff0c;不过也有没有少数没能进到自己内心向往的大厂而懊恼的&#xff0c;那么到底如何才能进大厂&#xff0c;该准…

启动mac版docker自带的k8s

最近准备好好学习下k8s&#xff0c;为了图方便&#xff0c;直接使用docker集成的k8s&#xff0c;但是网上找了一些教程但都没能一次性成功&#xff0c;只好自己从头跑一遍&#xff0c;顺手写个教程可以方便有类似需求的同学参考。 话不多说&#xff0c;直接上步骤。 1.下载doc…

yum安装mysql

在CentOS7中默认安装有MariaDB&#xff0c;这个是MySQL的分支&#xff0c;但为了需要&#xff0c;还是要在系统中安装MySQL&#xff0c;而且安装完成之后可以直接覆盖掉MariaDB。 1. 下载并安装MySQL官方的 Yum Repository 1[rootBrianZhu /]# wget -i -c http://dev.mysql.com…

springboot很多以来jar包是在外部当时候,如何打dockerfile到阿里云

首先保证springboot与各种jar包文件夹在同一目录 dockerfile如下内容 FROM frolvlad/alpine-oraclejdk8 VOLUME /usr/cloud ADD lib /lib/ ADD lib_attachment /lib_attachment/ ADD lib_bigdata /lib_bigdata/ ADD lib_bpm /lib_bpm/ ADD lib_deploy /lib_deploy/ ADD lib_el…

阿里P7大牛手把手教你!一眼就能看懂的Android自学手册,真香!

前言 曾听过很多人说Android学习很简单&#xff0c;做个App就上手了&#xff0c;工作机会多&#xff0c;毕业后也比较容易找工作。这种观点可能是很多Android开发者最开始入行的原因之一。 在工作初期&#xff0c;工作主要是按照业务需求实现App页面的功能&#xff0c;按照设…

【VScode】使用VScode 来写markdown时序图

准备工作在VScode中下载插件Markdown Preview Enhanced插件创建一个.md文件在VScode中打开文件&#xff0c;界面内点击右键可以看到Open preview to the side(还有很多方法外面都能搜到)&#xff0c;可以进行实时预览效果开始markdown第一行主标题&#xff08;次标题依次加#&am…

阿里P7大牛整理!BAT大厂面试基础题集合,成功入职字节跳动

都说大厂面试必问源码&#xff0c;可很多人看完MMKV 源码、Handler 源码、Binder 源码、OkHttp 源码等源码记不住&#xff0c;是脑子有问题吗&#xff1f;当然不是&#xff01;是因为你没有掌握学习源码的技巧。 我的朋友子路&#xff0c;很多人都叫他路神&#xff0c;称他为“…