首页 > 其他分享 >【django学习-25】登录及使用中间件进行登录校验

【django学习-25】登录及使用中间件进行登录校验

时间:2024-05-15 20:07:45浏览次数:21  
标签:username 25 登录 form 中间件 request django

  • 1.登录功能实现
    • 1.1:管理员表
from django.db import models

class Admin(models.Model):
    """ 管理员 """
    username = models.CharField(verbose_name="用户名", max_length=32)
    password = models.CharField(verbose_name="密码", max_length=64)

    def __str__(self):
        return self.username
  • 1.2:前端登录界面
{% 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>
        {% 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>
        <div class="form-group">
            <label for="id_code">图片验证码</label>
            <div class="row">
                <div class="col-xs-7">
                    {{ form.code }}
                    <span style="color: red;">{{ form.code.errors.0 }}</span>
                </div>
                <div class="col-xs-5">
                    <img id="image_code" src="/image/code/" style="width: 125px;">
                </div>
            </div>
        </div>
        <input type="submit" value="登 录" class="btn btn-primary">
    </form>
</div>

</body>
</html>
  • 1.3:如果用户名、密码正确,登录成功,写入cookie到浏览器,session到后台
from django.shortcuts import render, redirect,HttpResponse
from app01 import models
from app01.utils.bootstrap import BootStrapForm
from django import forms
from io import BytesIO
from app01.utils.encrypt import md5
from app01.utils.code import check_code

class LoginForm(BootStrapForm):
    username = forms.CharField(
        label="用户名",
        widget=forms.TextInput,
        required=True
    )
    password = forms.CharField(
        label="密码",
        widget=forms.PasswordInput(render_value=True),  # 错误提示的时候,内容不清空
        required=True      # 必填,默认为True
    )

    code = forms.CharField(
        label="验证码",
        widget=forms.TextInput,
        required=True
    )

    def clean_password(self):
        pwd = self.cleaned_data.get("password")
        return md5(pwd)

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': 'xwl', 'password': '1cd19cf980df7815e8303ab92ff66296'}
        # print(form.cleaned_data)  # {'username': 'xwl', 'password': '1cd19cf980df7815e8303ab92ff66296',"code":xxx}

        # 去数据库校验用户名和密码是否正确,获取用户对象、None
        # admin_object = models.Admin.objects.filter(username=xxx, password=xxx).first()
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            form.add_error("password", "用户名或密码错误")   # 主动在username字段显示错误信息
            # form.add_error("username", "用户名或密码错误")
            return render(request, 'login.html', {'form': form})

        # 用户名和密码正确
        # 网站生成随机字符串,写入浏览器的cookie中,再写入到session中
        request.session["info"] = {'id': admin_object.id, 'name': admin_object.username}
        # sesion可以保存7天
        request.session.set_expiry(60 * 60 * 24 * 7)
        return redirect('/admin/list/')

    return render(request,"login.html",{"form":form})
  • 2.网站的某些界面,必须要登录才能访问,未登录跳转到登录界面,我们可以在每个视图函数中判断,但是这个太麻烦了。Django为我们提供了一个轻量级的组件,中间件实现起来就很方便了。
    • 2.1:中间件介绍
      • 2.1.1:什么是中间件?
        • 是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能
      • 2.1.2:中间件可以定义五个方法,分别是:(主要的是process_request和process_response),在自己定义中间件时,必须继承MiddlewareMixin
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception)
process_response(self, request, response)
- 2.1.3:中间件流程
如果方法中没有返回值(返回None),继续向后走
如果有返回值 HttpResponse、render 、redirect,则不再继续向后执行。

  • 2.2:使用中间件
    • 2.2.1: 定义中间件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,redirect,HttpResponse

class AuthMiddleWare(MiddlewareMixin):
    def process_request(self,request):
        #  排除不需要登录运行访问的界面
        if request.path_info in ['/login/','/image/code/']:
            return
        # 1.读取当前访问的用户的session信息,如果能读到,说明已登陆过,就可以继续向后走
        info_dict = request.session.get("info")
        # 如果登录过,继续往后走
        if info_dict:
            return

        # 没登录过,返回登录界面
        return redirect('/login/')

- 2.2.2:配置中间件,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',
]
  • 3.如上所示,我们就实现了登录功能及登录验证

标签:username,25,登录,form,中间件,request,django
From: https://www.cnblogs.com/xwltest/p/18194617

相关文章

  • caddy自动https服务器中间件
    Caddy是一个功能丰富的开源Web服务器,具有自动HTTPS的能力。它被设计为易于使用,并具有现代化的功能和配置选项。以下是Caddy的一些主要特点:自动HTTPS: Caddy可以自动为您的网站提供HTTPS支持,而不需要复杂的配置。它使用Let'sEncrypt来自动获取和管理SSL/TLS证书......
  • 网站应用微信登录 DEMO
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>网站应用微信登录DEMO</title&g......
  • 网站应用微信登录 DEMO
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>网站应用微信登录DEMO</title&g......
  • 3SRB2516-ASEMI适配大功率充电桩3SRB2516
    编辑:ll3SRB2516-ASEMI适配大功率充电桩3SRB2516型号:3SRB2516品牌:ASEMI封装:SGBJ-5正向电流(Id):25A反向耐压(VRRM):1600V正向浪涌电流:400A正向电压(VF):1.05V引脚数量:5芯片个数:5芯片尺寸:88MIL功率(Pd):大功率设备工作温度:-55°C~150°C类型:整流桥、插件整流桥3SRB2516整流桥描......
  • 3SRB2508-ASEMI三相整流桥3SRB2508
    编辑:ll3SRB2508-ASEMI三相整流桥3SRB2508型号:3SRB2508品牌:ASEMI封装:SGBJ-5最大重复峰值反向电压:800V最大正向平均整流电流(Vdss):25A功率(Pd):大功率芯片个数:5引脚数量:5类型:整流扁桥、整流桥正向浪涌电流:400A正向电压:1.05V最大输出电压(RMS):封装尺寸:如图工作温度:-55°C......
  • vue---移动端登录页面
    最近在用vue做移动端,做了一个好看的移动端登录界面,保存一下,以后方便直接使用。具体代码:<template><divclass="main-login-container"><divclass="login-top"><imgclass="img":src="logintop"></div><divclass=&q......
  • Windows 10开启免密ssh登录&远程端口转发
    安装OpenSSH服务端设置-系统-可选功能-添加功能-在这里搜索OpenSSH服务端,然后开始安装即可开启sshd服务端可以使用图形界面使用命令行执行services.msc找到服务启动即可,并将其设置为自动。可以使用powershell执行命令启动服务启动服务:Start-Servicesshd查看状态:Get-Service......
  • 开发板登录返回以及退出设计
    IO编程开发板登录返回以及退出设计/******************************************************************************filename:2024-05-14_main.c*author:[email protected]*date:2024-05-14*function:在LCD上显示并触摸开发板登录返回以及退......
  • mysql+node.js前后端交互(简单实现注册登录功能)
    目录 sql文件 user.js注册部分  登录部分 对应的表操作usersql.js result.js用户提交的信息会进行格式化 ......
  • 粗浅设计一个登录平台
    设计一个程序,该程序在运行之后自动播放一段开机动画,开机动画结束后可以调转到登录界面,登录界面有2个按钮,分别是登录和退出,点击登录之后可以显示系统主界面。主界面自拟,要求主界面有一个返回按钮,点击返回按钮可以回到登录界面。(不使用goto)定义全局变量intcnt=0;intx,y;i......