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'))

最新文章

  1. DeprecatedAttribute vs. ObsoleteAttribute
  2. Spring声明式事务管理
  3. MySQL - MySQL++在c++11环境下接口设计
  4. BIOS设置之UEFI/Legacy BIOS切换图文详解
  5. BZOJ2490 Zombie’s Treasure Chest
  6. Backbone Events 源码笔记
  7. jquery.validate.js
  8. hadoop namanodejava
  9. Ajax Not Found,asp.net mvc 中
  10. Linux挂载NAS 网络附属存储
  11. luogu1330 封锁阳光大学 (dfs)
  12. HTML轮播图实现(前后端分离)
  13. Java notepad++ 配置
  14. uoj#274. 【清华集训2016】温暖会指引我们前行
  15. 关于oracle中varchar2与nvarchar2的一点认识
  16. 图片轮播(Jquery)
  17. 【Professional English】Words Summary
  18. MyEclipse教程:使用UML创建模块库——第一部分(一)
  19. leecode刷题(19)-- 最长公共前缀
  20. Spring笔记(二)

热门文章

  1. 如何设置select下拉禁止选择
  2. jQuery选择器整理
  3. kernel下制作动态logo
  4. if __name__ == "__main__": 的使用
  5. 4-3 set与delete命令的使用_(有一处打点 内容不确定)
  6. 解决swfupload改变display属性后flash重新加载的问题(chome,safari内核的所有浏览器)
  7. 03 MD5加密、Base64处理
  8. PythonNote03_HTML标签
  9. Blender 工具使用——显示键盘和鼠标操作
  10. 算法Sedgewick第四版-第1章基础-1.4 Analysis of Algorithms-006BitonicMax