zoukankan      html  css  js  c++  java
  • Django——11 状态保持 form表单 登陆注册样例

    Django

    1. 状态保持
    2. 用户状态例子
    3. 实现注册登陆实例
      1. django forms 表单的使用
      2. 注册功能
      3. 登陆功能

     

    状态保持cookie和session

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

    启用session

    先确认settings中

    这些都是默认开启的,需要操作的是,先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session的表格.

    用户登陆状态例子:

    home.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
        </style>
    </head>
    <body>
    欢迎用户:{{ username }}
    <br>
    <a href="{% url 'ss_login' %}">登陆</a><br>
    <a href="{% url 'ss_logout' %}">退出</a>
    </body>
    </html>

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登陆</title>
        <style>
        </style>
    </head>
    <body>
    <form action="" method="post">{% csrf_token%}
        <br>
        <input type="text" name="username"><br>
        <input type="submit" value="提交">
    </form>
    </body>
    </html>

     session_form/urls.py

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('home/', views.home, name='ss_home'),
        path('login_test/', views.login_test, name='ss_login'),
        path('logout_test/', views.logout_test, name='ss_logout'),
    ]

     session_form/views.py

    from django.shortcuts import render, redirect, reverse
    from django.http import HttpResponse
    # Create your views here.
    
    def home(request):
        # 主页面
        username = request.session.get('username', '未登录')
        return render(request, 'session_form/home.html', locals()) # locals方法,自动传参
    
    
    def login_test(request):
        # 登陆
        if request.method == 'POST':
            username = request.POST.get('username')
            if username:
                request.session['username'] = username
                request.session.set_expiry(0)  # 关闭浏览器就过期
                return redirect(reverse('ss_home'))
            return HttpResponse('请输入用户名')
        else:
            return render(request, 'session_form/login.html')
    
    def logout_test(request):
        # 退出
        request.session.flush()
        return redirect(reverse('ss_home'))
    • 1.一个既可读又可写的类似于字典的对象,表示当前的会话.
    • 2.在登录中使用request.session设置一个登录的信息.
    • 3.在主页面中获取设置的值,然后传给模板.
    • 4.使用request.session.flush()清除会话数据.
       
    • - set_expiry(value):设置会话的超时时间
    • - 如果没有指定,则两个星期后过期
    • - 如果value是一个整数,会话将在values秒没有活动后过期
    • - 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
    • - 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
    • - 如果value为None,那么会话永不过期

    可以不设置,这些都是默认设置

    结果展示:

     

     这时查看数据库dgango_session,就有一条数据

    点击退出

     

    再看django_session

     

    实现注册登陆实例

    思路:

    先创建模型生成注册表,用来存放注册的数据

    session_form/models.py

    from django.db import models
    
    # Create your models here.
    class User_Form(models.Model):
        username = models.CharField(max_length=10, unique=True)
        password = models.CharField(max_length=30)
        email = models.EmailField(max_length=20)

     映射文件:makemigrations         migrate

    关于django forms 表单的使用:

    • 1. 创建一个forms.py的文件,放在指定的app当中,然后在里面写表单.
    • 2. 表单是通过类实现的,继承自forms.Form,然后在里面定义要验证的字段.
    • 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_valid()返回True的时候,保存用户提交上来的数据.

    作用:

    • 可以生成前端代码,也可以用作验证数据的合法性

    forms中的参数说明:

    • max_length  最大长度
    • min_length  最小长度
    • widget  负责渲染网页上HTML 表单的输入元素和提取提交的原始数据
    • attrs  包含渲染后的Widget 将要设置的HTML 属性
    • error_messages 报错信息

    注意:虽然forms可以生成前端代码,但这个功能很少用到,主要是用来用作表单数据的验证合法性

    注册

    新建表单文件,forms.py  注册用

    from django import forms
    
    class Register(forms.Form):

        # 可以写前端代码,但功能主要在于后台信息的验证

        username = forms.CharField(max_length=10, min_length=2,
                                   error_messages={'min_length': '用户名字长少于2',
                                                   'max_length': '用户名不得多于10'})
        password = forms.CharField(max_length=15, min_length=4,
                                   widget=forms.PasswordInput(),
                                   attrs={'placeholder': '请输入密码'},
                                   error_messages={
                                       'min_length': '密码长度小于6',
                                       'max_length': '密码长度超过8了'
                                   })
        password_repeat = forms.CharField(widget=forms.PasswordInput())
        email = forms.EmailField()

     再创建注册的页面  register.html 

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
        </style>
    </head>
    <body>
    <form action="" method="post">{% csrf_token %}
    {#里面使用的时forms.py创建的表单#}
        {{ register_form.as_p }}
        <input type="submit" value="提交">
    </form>
    </body>
    </html>

    session_form/views.py

    from django.contrib.auth.hashers import make_password
    from
    django.views import View from .forms import RegisterForm from .models import User_Form class Register(View): def get(self, request): register_form = RegisterForm() return render(request, 'session_form/register.html', locals()) def post(self, request): 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
    = User_Form() user.username = username user.password = password user.email = email user.save() return redirect(reverse('ss_login')) return HttpResponse('注册失败') print(form.errors) return HttpResponse(form.errors)

     配置好url

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('home/', views.home, name='ss_home'),
        path('login/', views.LoginTest.as_view(), name='ss_login'),
        path('login_test/', views.login_test, name='login_test'), # 状态保持的login
        path('logout_test/', views.logout_test, name='ss_logout'),
        path('register/', views.Register.as_view(), name='ss_register'),
    ]

     就可以看到注册页面了

     

    注册信息符合规则以后,就会再数据库中显示出来

    登陆

     创建一个登陆页面login_form.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登陆</title>
        <style>
        </style>
    </head>
    <body>
    <form action="" method="post">{% csrf_token %}
        {{  form.as_p }}
        <input type="submit" value="提交">
    </form>
    </body>
    </html>

    session_form/forms.py

    from django import forms
    
    
    class LoginForm(forms.Form):
        username = forms.CharField(max_length=10, min_length=2,)
        password = forms.CharField(max_length=15, min_length=4,
                                   widget=forms.PasswordInput())

     这里使用了表单的验证合法性,并没有使用生成前端代码的功能

    views.py

    from django.contrib.auth.hashers import check_password
    from
    .forms import LoginForm class LoginTest(View): def get(self, request):
         form = LoginForm()
    return render(request, 'session_form/login_form.html', locals()) def post(self, request): form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') user = User_Form.objects.filter(username=username, password=password) if user:
           # if check_password(password.user[0].password): # 还可以这样判断 request.session[
    'username'] = username return redirect(reverse('ss_home')) return redirect(reverse('ss_register')) print(form.errors) return HttpResponse(form.errors)

    url配置还是前面的

    现在使用前面注册的账号来登陆

    查看数据库django_session

     

    这样就完成了注册和登陆的功能

  • 相关阅读:
    PHP学习—Cookie&Session
    IP组播综合实验
    k8s kubeadm部署高可用集群
    python调用zbbix的api实现批量添加域名监控脚本
    Python调用Harbor api删除私有仓库harbor镜像
    Kubernetes故障排查指南-分析容器退出状态码
    blackbox_exporter+grafana+prometheus监控主机存活,端口存活及网站状态
    k8s中使用ceph-csi在ceph中进行数据持久化
    Jenkins+K8S流水线自动化部署Java程序
    生产环境k8s中使用helm部署prometheus+grafana监控k8s集群中相关node和pod
  • 原文地址:https://www.cnblogs.com/pywjh/p/10222549.html
Copyright © 2011-2022 走看看