zoukankan      html  css  js  c++  java
  • 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'))
  • 相关阅读:
    SSH和SSL比较
    SSL虚拟主机安全方案
    https在电子邮件安全解决方案
    centos tomcat安装
    laravel 添加第三方扩展库
    laravel-1 安装.配置
    centos7.0 vsftp配置
    centos 日常操作指令
    centos redis 安装
    centos php 扩展安装
  • 原文地址:https://www.cnblogs.com/xuchengcheng1215/p/9414618.html
Copyright © 2011-2022 走看看