前提:中间件版的登录验证需要依靠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

Django通过中间件实现登录验证demo相关推荐

  1. django系列8.3--django中间件实现登录验证(1)

    中间件版的登录验证需要依靠session,所以数据库中要有django_session表. urls.py from django.conf.urls import url from app01 im ...

  2. django框架下后台登录验证

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.中间件的设置 二.登录与退出 三,添加验证码 总结 前言 对于后台管理页面,需要设置 1.中间件:用来防止用户未登 ...

  3. django中间件及中间件实现的登录验证

    1.定义 一个用来处理Django的请求和响应的框架级别的钩子(函数),相对比较轻量级,并且在全局上改变django的输入与输出(使用需谨慎,否则影响性能) 直白的说中间件就是帮助我们在视图函数执行之 ...

  4. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  5. Django的中间件

    Django的中间件 目录 中间件介绍 什么是中间件? 自定义中间件 自定义一个中间件示例 process_request process_response process_view process_ ...

  6. Django中间件——实现登陆验证

    目录 中间件(MiddleWare) 定义 内置的六个切点(钩子函数) 自定义中间件 规则 实例之--登录验证 中间件(MiddleWare) 定义 面向切面编程(IoC), 为开发者提供了一种无侵入 ...

  7. Django 重写authenticate实现输入账号、邮箱、手机号登录验证

    介绍 authenticate原本是账号和密码登录,在密码对给出的用户名合法的情况下返回一个 User 对象. 如果密码不合法,authenticate()返回None.重写该方法后,实现输入账号.邮 ...

  8. Django之使用自定义用户表(AbstractUser)/自定义登录验证(jwt)/获取当前登录用户

    基本步骤: 一.自定义用户表: 1.自定义的用户表继承AbstractUser: 2.settings.py添加配置,指向用户表:AUTH_USER_MODEL = 'myUser.Account'( ...

  9. Django之中间件

    一.CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上第二种 @method_decorator(login_auth,name='get') 加在类上第三种 @met ...

最新文章

  1. 基于 OpenCV 和 OpenPose 的棒球挥杆人体姿势估计
  2. 【python】app未注册用户自动筛选
  3. android qq 进程保活,Android保活从入门到放弃:乖乖引导用户加白名单吧(附7大机型加白示例)...
  4. 在WebGL场景中进行棋盘操作的实验
  5. 测试AtomicInteger与普通int值在多线程下的递增操作
  6. python软件设置代码字体的大小_Pycharm4.5设置字体大小以及背景颜色的方法
  7. 【PAT甲】1007 Maximum Subsequence Sum (25分),求最大字段和及区间
  8. Cimage类的介绍及使用
  9. IT大公司面试流程与总结
  10. LLVM 学习(二) -LLVM IR 语法理论学习
  11. 《麻省理工学院公开课:人工智能》笔记四
  12. JavaScript图片旋转缩放、像素矩阵获取
  13. 图像宽度所占字节必须是4的倍数详解
  14. 2020年杭州社保个人最低交多少
  15. MapGIS K9三维TDE平台插件开发第一个插件程序(新手入门必看)
  16. Golang和HTTPS在网站前端接入里的作用
  17. 计算机窗口颜色不能自定义,用RBG颜色设置自定义颜色
  18. 第六十九章 SQL函数 JSON_OBJECT
  19. day11学习 前端HTML网页基本结构、标签及超链接的使用、内联框架
  20. win10 WSL运行32位程序

热门文章

  1. Mac pycharm flask 用内网ip 运行 web
  2. Python使用select实现异步通信
  3. NUC972配置为支持NFS
  4. PS教程第二十课:有了选区就有了界限
  5. [html] HTML全局属性(global attribute)有哪些(包含H5)?
  6. 前端学习(2760):image基本使用
  7. 工作38:实现分页秀呀
  8. 前端学习(2258)如何做标签管理
  9. “约见”面试官系列之常见面试题第三十七篇之CSS3新属性(建议收藏)
  10. 前端学习(1272):路由的基本概念和说明