Django 11 form表单(状态保持session、form表单及注册实现)

一、状态保持 session

  状态保持

#1、http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
#2、客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端储存与会话有关的数据
#3、储存方式包括cookie、session,会话一般指session
#4、使用cookie,所有数据存储在客户端,注意不要存储敏感数据
#5、是由session方式,所有数据存储在服务器端,在客户端cookie中存储session_id
#6、状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据 #注意:不同请求者之间不会共享这个数据,与请求者一一对应

  使用session

#启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象

-get(key,default=None) #根据键获取会话的值
-clear() #清除所有会话
-flush() #删除当前的会话数据并删除会话的cookie
-del request.session['member_id']- #删除

  会话过期时间

#1、代码中配置
#set_expiry(value)表示设置会话的过期时间;如果没有指定,默认为两星期后过期
#如果value是一个整数,则回家整数秒后过期;如果value是一个imedelta对象,会话将会在当前时间加上这个指定的日期/时间过期
#如果value是0,那么用户会话的cookie将会在用户的浏览器关闭时过期;如果value为None,那么会话永不过期 #2、配置文件settings里面配置
#是否关闭浏览器使得session过期,默认为False
SESSION_EXPIRY_AT_BROWSER_CLOSE = False #是否每次请求都保存session,默认修改之后保存
SESSION_SAVE_EVERY_REQUEST = False #session的cookie失效时间,默认为2周
SESSION_COOKIE_AGE = 1209600
from django.shortcuts import render,redirect,reverse

# Create your views here.

def home(request):
'''
主页
'''
username = request.session.get('username','未登录') #在登录的时候设置了session,这里就用session来获取用户信息
return render(request,'test22/home.html',
context={'username':username}) def login_test(request):
'''
登录页
'''
if request.method == 'GET':
return render(request,'test22/login.html')
elif request.method == 'POST':
username = request.POST.get('username') #获取POST中的username
request.session['username'] = username #session是一个字典对象,直接传值便可以存入数据
request.session.set_expiry(0) #set_expiry(value)表示设置会话的过期时间;如果没有指定,默认为两星期后过期
#如果value是一个整数,则回家整数秒后过期;如果value是一个imedelta对象,会话将会在当前时间加上这个指定的日期/时间过期
#如果value是0,那么用户会话的cookie将会在用户的浏览器关闭时过期;如果value为None,那么会话永不过期
return redirect(reverse('test22_home')) def logout(request):
'''
退出
'''
request.session.flush()
return redirect(reverse('test22_home'))

二、form表单及注册实现

  form表单的引用

#登录页面和注册页面都会用form表单来提交数据

#当数据提交到后台去,都需要在视图函数中去验证数据的合法性

#django中提供了一个form表单的功能,这个表单可以用来验证数据的合法性,还可以用来生成html代码(生成代码功能基本不用)

  关于django form表单的使用

#1、创建一个forms.py的文件,放到指定的app中,然后在里面写表单

#2、表单是通过类实现的,继承自formsForm,然后在里面定义要验证的字段

#3、在表单中,创建字段和模型是一模一样的,但是没有null=True或者blank=True等这几种参数了,有的参数是required=True/False

#4、使用is_valid()方法可以验证用户提交的数据是否合法,而且HTML表单元素的name必须和django中的表单的name保持一致,否则匹配不到

#5、is_bound属性  用来表示form是否绑定了数据,如果绑定了,则返回True,否则返回False

#6、cleaned_data  这个实在is_vaild()返回True的时候,保存用户提交上来的数据

  form.py

from django import forms

class AddForm(forms.Form):
first = forms.IntegerField()
second = forms.IntegerField() class RegisterForm(forms.Form):
username = forms.CharField(max_length=20,min_length=6)
password = forms.CharField(max_length=10,min_length=6,
widget=forms.PasswordInput( #width、attrs、error_message是前端的内容
attrs={'placeholder':'请输入密码'}
),
error_messages={'min_length':'密码长度小于6',
'max_length':'密码长度大于10'}
)
password_repeat = forms.CharField(widget=forms.PasswordInput())
email = forms.EmailField() class LoginForm(forms.Form):
username = forms.CharField(max_length=20,min_length=6)
password = forms.CharField(max_length=10,min_length=6)

  view.py

from django.shortcuts import render,redirect,reverse
from django.http import HttpResponse
from django.contrib.auth.hashers import make_password,check_password
# Create your views here. from .forms import AddForm,RegisterForm,LoginForm
from .models import User
def add_test(request):
if request.method == 'GET':
form = AddForm()
return render(request,'test22/add_test.html',
context={'form':form, #这就是模型渲染到模板中
})
elif request.method == 'POST':
form = AddForm(request.POST) #把POST的值放到AddForm类当中去,然后在赋值给form,就是拿到POST的值
if form.is_valid(): #判断是否合法
first = form.cleaned_data.get('first') #通过cleaned_data方法获取,这也是一个字典类型的,可以用get拿到数据
second = form.cleaned_data.get('second')
return HttpResponse(first*second) def register(request):
'''
注册页
'''
if request.method == 'GET':
form = RegisterForm()
return render(request,'test22/register.html',
context={'form':form})
elif request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
password_repeat = form.cleaned_data.get('password_repeat')
email = form.cleaned_data.get('email')
if password == password_repeat:
password = make_password(password) #给用户输入的密码加密
User.objects.create(username = username,
password = password,
email = email)
return render(request,'test22/login.html')
else:
return HttpResponse('注册失败')
else:
return HttpResponse('注册失败') def login(requset):
'''
登录页
'''
if requset.method == 'GET':
form = LoginForm()
return render(requset,'test22/login.html',
context={'form':form})
elif requset.method == 'POST':
form = LoginForm(requset.POST)
if form.is_valid():
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password')
user = User.objects.filter(username=username) #查询数据库中名字为username的数据
if user:#如果存在
if check_password(password,user[0].password): #验证POST中的密码和数据库中的密码是否相同,相同,session;不同,返回登录页面
requset.session['username'] = username
return render(requset,'test22/home.html')
else:
redirect(reverse('login'))
else:
return redirect(reverse('login'))
else:
return redirect(reverse('login'))

Django 11 form表单(状态保持session、form表单及注册实现)的更多相关文章

  1. Django——11 状态保持 form表单 登陆注册样例

    Django 状态保持 用户状态例子 实现注册登陆实例 django forms 表单的使用 注册功能 登陆功能   状态保持cookie和session 1.http协议是无状态的:每次请求都是一次 ...

  2. django 表单系统 之 forms.Form

    继承forms.Form实现django表单系统 参考: https://www.cnblogs.com/zongfa/p/7709639.html https://www.cnblogs.com/c ...

  3. (二)无状态的web应用(单py的Django占位图片服务器)

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 阅读本文建议了解Django框架的基本工作流程,了解WSGI应用,如果对以上不是很清楚,建议结 ...

  4. java web学习总结(十三) -------------------使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  5. [Java拾遗五]使用Session防止表单重复提交

    申明:此文章属于转载, 转自博客: http://www.cnblogs.com/xdp-gacl/p/3859416.html在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没 ...

  6. JavaWeb学习总结(十三)——使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  7. (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交

    如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...

  8. Django之路:QuerySet API,后台和表单

    一.Django QuerySet API Django模型中我们学习了一些基本的创建和查询.这里专门讲以下数据库接口相关的接口(QuerySet API),当然你也可以选择暂时跳过这节.如果以后用到 ...

  9. JavaWeb学习 (十二)————使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

随机推荐

  1. Struts旅程(六)Struts页面转发控制ActionForward和ActionMapping

    转自:https://blog.csdn.net/lovesummerforever/article/details/19125933

  2. Shell编程进阶 1.4 shell自定义变量

    变量 系统自带变量 echo $PATH $HOME $PWD 自定义变量 # a= # echo $a1 # b= # echo $b2 写与用户交互的脚本 vim .sh #!/bin/bash ...

  3. java定时器控制时间打印

    public class test2 { public static void main(String []args){ Timer timer=new Timer(); timer.schedule ...

  4. Hive UDF开发 第一个例子

    package udf; import org.apache.hadoop.hive.ql.exec.UDF; public class helloudf extends UDF{ public St ...

  5. 【271】IDL-ENVI二次开发

    参考:String Processing Routines —— 字符串处理函数 01   STRING 返回字符串. 02   STRCMP 比较字符串,一样返回1,不一样返回0,默认大小写敏感. ...

  6. Android按钮单击事件的四种常用写法

    这篇文章主要介绍了Android按钮单击事件的四种常用写法总结,比较了常见的四种写法的优劣,有不错的参考借鉴价值,需要的朋友可以参考下 很多学习Android程序设计的人都会发现每个人对代码的写法都有 ...

  7. php 中两种获得数据库中 数据条数的方法

    一种是传统的利用mysql_num_rows()来计算 $sql="select * from news"; $res=mysql_query($sql); $number=mys ...

  8. IFC标准 IFCWALLSTANDARDCASE参数说明

    例如: #229= IFCWALLSTANDARDCASE('3_ydjarPr1s9tRASGqIAUD',#41,'\X2\57FA672C5899\X0\:\X2\78165899\X0\240 ...

  9. #pragma pack()用法详解

    博客转载自:http://blog.csdn.net/lime1991/article/details/44536343 1.什么是对齐?为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从 ...

  10. 37LCD-TFTLCD原理与配置

    1.TFTLCD驱动原理 简介