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

 

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

 

posted on 2018-08-03 15:57  许铖铖  阅读(274)  评论(0编辑  收藏  举报