Django通过中间件实现登录验证demo

前提:中间件版的登录验证需要依靠session,所以数据库中要有django_session表。

 1 from django.conf.urls import url
 2 from django.contrib import admin
 3 from app01 import views
 4
 5 urlpatterns = [
 6     url(r‘^admin/‘, admin.site.urls),
 7     url(r‘^login/$‘, views.login, name=‘login‘),
 8     url(r‘^index/$‘, views.index, name=‘index‘),
 9     url(r‘^home/$‘, views.home, name=‘home‘),
10 ]

urls.py

 1 from django.shortcuts import render, HttpResponse, redirect
 2
 3
 4 def index(request):
 5     return HttpResponse(‘this is index‘)
 6
 7
 8 def home(request):
 9     return HttpResponse(‘this is home‘)
10
11
12 def login(request):
13     if request.method == "POST":
14         user = request.POST.get("user")
15         pwd = request.POST.get("pwd")
16
17         if user == "jason" and pwd == "jason666":
18             # 设置session
19             request.session["user"] = user
20             # 获取跳到登陆页面之前的URL
21             next_url = request.GET.get("next")
22             # 如果有,就跳转回登陆之前的URL
23             if next_url:
24                 return redirect(next_url)
25             # 否则默认跳转到index页面
26             else:
27                 return redirect("/index/")
28     return render(request, "login.html")

views.py

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>登录页面</title>
 6 </head>
 7 <body>
 8 <form action="{% url ‘login‘ %}" method="post">
 9     {% csrf_token %}
10     <p>
11         <label for="user">用户名:</label>
12         <input type="text" name="user" id="user">
13     </p>
14     <p>
15         <label for="pwd">密 码:</label>
16         <input type="text" name="pwd" id="pwd">
17     </p>
18     <input type="submit" value="登录">
19 </form>
20 </body>
21 </html>

login.html

 1 from django.utils.deprecation import MiddlewareMixin
 2
 3
 4 class AuthMD(MiddlewareMixin):
 5     white_list = [‘/login/‘, ]  # 白名单
 6     black_list = [‘/black/‘, ]  # 黑名单
 7
 8     def process_request(self, request):
 9         from django.shortcuts import redirect, HttpResponse
10
11         next_url = request.path_info
12         print(request.path_info, request.get_full_path())
13         # 黑名单的网址限制访问
14         if next_url in self.black_list:
15             return HttpResponse(‘This is an illegal URL‘)
16         # 白名单的网址或者登陆用户不做限制
17         elif next_url in self.white_list or request.session.get("user"):
18             return
19         else:
20             return redirect("/login/?next={}".format(next_url))

mymiddlewares.py

 1 MIDDLEWARE = [
 2     ‘django.middleware.security.SecurityMiddleware‘,
 3     ‘django.contrib.sessions.middleware.SessionMiddleware‘,
 4     ‘django.middleware.common.CommonMiddleware‘,
 5     ‘django.middleware.csrf.CsrfViewMiddleware‘,
 6     ‘django.contrib.auth.middleware.AuthenticationMiddleware‘,
 7     ‘django.contrib.messages.middleware.MessageMiddleware‘,
 8     ‘django.middleware.clickjacking.XFrameOptionsMiddleware‘,
 9     ‘app01.mymiddlewares.AuthMD‘
10 ]

settings注册中间件

AuthMD中间件注册后,所有的请求都要走AuthMD的process_request方法。

如果URL在黑名单中,则返回This is an illegal URL的字符串;

访问的URL在白名单内或者session中有user用户名,则不做阻拦走正常流程;

正常的URL但是需要登录后访问,让浏览器跳转到登录页面。

注:AuthMD中间件中需要session,所以AuthMD注册的位置要在session中间的下方。

原文地址:https://www.cnblogs.com/changwentao/p/9669691.html

时间: 2024-08-29 12:14:28

Django通过中间件实现登录验证demo的相关文章

72、Django 之 中间件

前戏 在给给视图函数加装饰器时来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能都需要加上装饰器,这样是不是稍微有点繁琐. 学完今天的内容之后呢,我们就可以用更适宜的方式来实现类似给所有请求都做相同操作的功能了 中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都

Django+中间件+登录验证

Django的request请求需要首先经过中间件处理,再通过URL查找到对应的views函数进行处理.在settings的MIDDLEWARE_CLASSES中 添加设置中间件进行激活,大致原理如下图所示: 在使用Django框架进行开发的过程中,遇到一个问题:要求对觉得多数页面请求request进行用户登录验证,如果用户没有登录则跳转回到登录页面: 如果用户登录了,则直接跳转到新的链接页面? 在django中提供了一种自定义装饰器@login_required来实现验证用户登录: 1 # c

巨蟒django之CRM1 需求分析&amp;&amp;表结构设计&amp;&amp;注册登录验证

1.需求分析 1.项目 (1)业务 (2)权限的管理 2.CRM customer relationship management 客户关系管理系统 3.谁来使用CRM? 销售&&班主任&&讲师&&助教 4.项目的需求分析 (1)注册 (2)登录 (3)销售 1.客户信息管理 增加 编辑 展示 客户信息(删除一般不用它做,后台管理员来做,为了信息安全) 2.跟进信息管理 增加 编辑 展示 跟进信息 3.报名信息的管理 增加 编辑 展示 报名信息 4.缴费记录

Django user authenticate 登录验证

Django视图函数 view视图函数 from django.shortcuts import render,redirect from django.contrib.auth import authenticate,login,logout def acc_login(request): “登录验证”’ error_msg = '' if request.method == "POST": username = request.POST.get('username') passwo

django -- 登录验证

django -- 登录验证 环境说明 Django:1.10 Python:3.6 以 AbstractUser 方式扩展内置 User # models.py 定义 model from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class UserProfile(AbstractUser): # 昵称 nick_name = m

Django之中间件与form其他用法

中间件常用的五种方法: process_request(self,request) process_request有一个参数,就是request,与视图函数中的request一样.它的返回值可以是None也可以是HttpResponse对象.返回值是None,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而将相应对象返回给浏览器. 示例: 应用下自定义一个文件夹,自定义一个py文件: from django.utils.deprecat

Django对中间件的调用思想、csrf中间件详细介绍、Django settings源码剖析、Django的Auth模块

目录 使用Django对中间件的调用思想完成自己的功能 功能要求 importlib模块介绍 功能的实现 csrf中间件详细介绍 跨站请求伪造 Django csrf中间件 form表单 ajax csrf相关装饰器 在CBV上加csrf装饰器 Django settings源码剖析及模仿使用 Django settings源码剖析 查看内部配置文件 模仿使用 Auth模块 auth简介 auth模块常用方法 创建用户 校验用户名和密码 保存用户登录状态 判断当前用户是否登录 校验原密码 修改密

ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware.CustomizeMiddleware和Asp.NetCore Identity.但是由于所有的ASP.NET Core的版本有些老,所以,此次重写一次.使用最新的ASP.NET Core 1.1版本.对于ASP.NET Core 1.1 Preview 1会在以后的文章中介绍 目录 使用静态文件 使用路由

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(三)给Shiro登录验证加上验证码

序: 给Shiro加入验证码,有多种方式,当然你也可以通过继承修改FormAuthenticationFilter类,通过Shiro去验证验证码.具体实现请百度: 应用Shiro到Web Application(验证码实现) 而今天我要说的,既然使用的SpringMVC,为什么不直接在Controller中就处理验证码验证,让事情变的更简单一点呢? 一.新建ValidateCode.java验证码工具类 package org.shiro.demo.util; import java.util.