当前位置: 首页 > news >正文

【Django】开发日报_8_Day:手机号码管理系统(6)

目录

          • 1、实现用户登录
            • (0)知识点补充
            • (1)搭建页面
            • (2)实现身份校验
            • (3)中间件处理
            • (4)创建中间件样例
            • (5)基于中间件实现登录验证
            • (6)实现用户注销功能

1、实现用户登录
(0)知识点补充

在这里插入图片描述
在这里插入图片描述

(1)搭建页面
思路:url->views->html

urls.py

path('login/', account.login),

views->account.py

from django.shortcuts import render
def login(request):
    """登录"""

    return render(request,'login.html')

login.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
    <style>
        .account{
            width: 400px;
            border: 1px solid #dddddd;
            border-radius: 5px;
            box-shadow: 5px 5px 20px #aaa;

            margin-left: auto;
            margin-right: auto;
            margin-top: 100px;
            padding: 20px 40px;
        }
        .account h2{
            margin-top: 10px;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="account">
        <h2>用户登录</h2>
        <form>
            <div class="form-group">
                <label>用户名</label>
                <input type="text" class="form-control" id="exampleInputEmail1" placeholder="用户名">
            </div>
            <div class="form-group">
                <label>用户名</label>
                <input type="password" class="form-control" placeholder="密码">
            </div>

            <input type="submit" value="登录" class="btn btn-primary">
        </form>


    </div>
</body>
</html>

访问效果
在这里插入图片描述

(2)实现身份校验

修改一下样式类继承BootStrap.py

from django import forms

class BootStrap:
    def __init__(self, *args, **kwargs):
        # 引用父类的ini方法
        super().__init__(*args, **kwargs)
        #循环ModelForm中的字段,给每个字段的插件设置
        for name, field in self.fields.items():
            #字段中有属性,保留原来属性,没有属性增加属性
            if field.widget.attrs:
                field.widget.attrs["class"] = "form-control"
                field.widget.attrs["placeholder"] = field.label
            else:
                field.widget.attrs = {
                    "class":"form-control",
                    "placeholder":field.label
                }

class BootStrapModelForm(BootStrap,forms.ModelForm):
    pass

class BootStrapForm(BootStrap,forms.Form):
    pass

使用form组件form.py

class LoginForm(BootStrapForm):#采用继承
    username = forms.CharField(
        label="用户名",
        widget=forms.TextInput,#(attrs={'class':"form-control",'placeholder':'用户名'})
        required=True
    )
    password = forms.CharField(
        label="密码",
        widget=forms.PasswordInput(render_value=True),#render_value=True:保留原来字段#(attrs={'class':"form-control",'placeholder':'密码'})
        required=True
    )
    def clean_password(self):
        pwd = self.cleaned_data.get("password")
        return md5(pwd)

# class LoginModelForm(forms.ModelForm):
#     class Meta:
#         model = models.Admin
#         fields = ["username",'password']

视图函数,account.py

from django.shortcuts import render,HttpResponse,redirect
from app01.utils.form import LoginForm
from app01 import models

def login(request):
    """登录"""
    if request.method == "GET":
        form = LoginForm()
        return render(request,'login.html',{'form':form})

    form = LoginForm(data = request.POST)
    if form.is_valid():
        #print(form.cleaned_data)
        #{'username': '111', 'password': '111'}
        #{'username': '111', 'password': '70a53ebb8836a4400fe2827ab6cc86bf'}
        #去数据库进行校验,获取用户对象、None
        #admin_object = models.Admin.objects.filter(username=form.cleaned_data['username'],password=form.cleaned_data['password']).first()
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
        #用户名为空
        if not admin_object:
            form.add_error("password","用户名或密码错误")
            return render(request, 'login.html', {'form': form})
        #用户名和密码正确
        #网站随机生成字符串,写到用户浏览器的cookie中,在写入到session中
        request.session["info"] = {'id':admin_object.id,'name':admin_object.username}
        return redirect("/admin/list/")
    return render(request,'login.html',{'form':form})

login.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
    <style>
        .account{
            width: 400px;
            border: 1px solid #dddddd;
            border-radius: 5px;
            box-shadow: 5px 5px 20px #aaa;

            margin-left: auto;
            margin-right: auto;
            margin-top: 100px;
            padding: 20px 40px;
        }
        .account h2{
            margin-top: 10px;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="account">
        <h2>用户登录</h2>
        <form method="post" novalidate><!--novalidate:开启前端校验-->
            {% csrf_token %}
            <div class="form-group">
                <label>用户名</label>
                {{ form.username }}
                <span style="color: red">{{ form.username.errors.0 }}</span>
            </div>
            <div class="form-group">
                <label>用户名</label>
                {{form.password}}
                <span style="color: red">{{ form.password.errors.0 }}</span>
            </div>

            <input type="submit" value="登录" class="btn btn-primary">
        </form>


    </div>
</body>
</html>

访问页面
在这里插入图片描述
在这里插入图片描述

(3)中间件处理

给每个页面进行验证(是否已经登录,没登录无法访问网站其他页面)
在这里插入图片描述
在这里插入图片描述
图解中间件
在这里插入图片描述

(4)创建中间件样例

新建目录和文件

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect,render

class M1(MiddlewareMixin):
    """中间件1"""
    def process_request(self,request):
        #没有返回值,返回None,继续向后走
        #有返回值 HttpResponse
        print("M1.进来了")
        #return HttpResponse("无权访问")
        #return render()
        #return redirect()
        

    def process_response(self,request,response):
        print("M1.走了")
        return response

class M2(MiddlewareMixin):
    """中间件2"""
    def process_request(self,request):
        print("M2.进来了")

    def process_response(self,request,response):
        print("M2.走了")
        return response

修改setting.py注册中间件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'app01.middleware.auth.M1',
    'app01.middleware.auth.M2',
]

接下来访问页面会发现,每次访问都会调用中间件
在这里插入图片描述
符合这个过程
在这里插入图片描述
在这里插入图片描述

(5)基于中间件实现登录验证

编写中间件
auth.py

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect,render

class AuthMiddleware(MiddlewareMixin):
    """中间件"""
    def process_request(self,request):
        #0、排除不需要登录验证就能访问的页面
        if request.path_info == "/login/":
            return
        #1、读取当前访问的用户的session信息,如果能读到,说明已登录过,就可以继续向后走
        info_dict = request.session.get("info")
        if info_dict:
            return
        # 2、没登录过,重新登录
        return redirect("/login/")

应用中间件
setting.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'app01.middleware.auth.AuthMiddleware',
]

访问页面:
没登录就只能看到登录界面
在这里插入图片描述

(6)实现用户注销功能

注销:说白了,就是将浏览器cookie中session的数据清除掉。
在这里插入图片描述
实现方法
urls,py

path('logout/', account.logout),

account.py

def logout(request):
    """注销"""
    request.session.clear()
    return redirect("/login/")

修改模板,添加链接和显示昵称
在这里插入图片描述
template.py

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
        {% block title_content %}
        {% endblock %}
    </title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
</head>
<body>
<!--导航-->
<div class="bs-example" data-example-id="inverted-navbar">
    <nav class="navbar navbar-inverse">
        <div class="container">
            <!-- Brand and toggle get grouped for better mobile display -->
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                        data-target="#bs-example-navbar-collapse-9" aria-expanded="false">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="/pretty/list/">靓号管理系统</a>
            </div>

            <!-- Collect the nav links, forms, and other content for toggling -->
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-9">
                <ul class="nav navbar-nav">
                    <li><a href="/admin/list/">管理员账户</a></li>
                    <li><a href="/depart/list/">部门管理</a></li>
                    <li><a href="/user/list/">用户管理</a></li>
                    <li><a href="/pretty/list/">靓号管理</a></li>

                </ul>
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="/login/">登录</a></li>
                    <li class="dropdown">
                        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
                           aria-expanded="false">{{ request.session.info.name }} <span class="caret"></span></a>
                        <ul class="dropdown-menu">
                            <li><a href="#">个人资料</a></li>
                            <li><a href="#">我的信息</a></li>
                            <li role="separator" class="divider"></li>
                            <li><a href="/logout/">注销</a></li>
                        </ul>
                    </li>
                </ul>
            </div><!-- /.navbar-collapse -->

        </div><!-- /.container-fluid -->
    </nav>
</div>

{% block content %}{% endblock %}

<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
</body>
</html>

登录网站
在这里插入图片描述
实现注销和显示用户昵称功能
在这里插入图片描述

相关文章:

  • Quartz框架之Job和JobDetail(2)
  • C语言刷题(二)
  • 【毕业设计】机器学习股票大数据量化分析与预测系统 - python 毕业设计
  • Ubuntu下安装opencv
  • 手把手带你刷好题(牛客刷题⑦)
  • Java保证线程安全的方式有哪些?
  • 《数据结构》队列及其经典面试题
  • 计算机图形学(十一):真实感图形(光照模型、材质模型)
  • 【云原生】Hadoop HA on k8s 环境部署
  • 四元数是什么
  • 大衣哥家里再添喜事,生产厂家免费送给他一辆新车
  • 爬取疫情数据并存到mysql数据库
  • 场景应用:网络的子网掩码为255.255.240.0,它能够处理的主机数是多少?
  • Qt5开发从入门到精通——第七篇六节( 图形视图—— 图元的旋转、缩放、切变、和位移)
  • 内网穿透工具natapp的注册、下载、安装与使用(详细教程)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • Apache的基本使用
  • ES6之路之模块详解
  • input实现文字超出省略号功能
  • javascript面向对象之创建对象
  • Java深入 - 深入理解Java集合
  • JAVA之继承和多态
  • jquery ajax学习笔记
  • Python中eval与exec的使用及区别
  • Redash本地开发环境搭建
  • Redis 中的布隆过滤器
  • SegmentFault 2015 Top Rank
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue--数据传输
  • yii2中session跨域名的问题
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 今年的LC3大会没了?
  • 时间复杂度与空间复杂度分析
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 物联网链路协议
  • 携程小程序初体验
  • 一个项目push到多个远程Git仓库
  • 《天龙八部3D》Unity技术方案揭秘
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 数据可视化之下发图实践
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​520就是要宠粉,你的心头书我买单
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​批处理文件中的errorlevel用法
  • ​如何在iOS手机上查看应用日志
  • #if和#ifdef区别
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (day 12)JavaScript学习笔记(数组3)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (理论篇)httpmoudle和httphandler一览
  • (力扣)1314.矩阵区域和
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)人的集合论——移山之道
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网