Django实战项目-学习任务系统-自定义URL拦截器
接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。
首先增加URL拦截器,你不会希望没有登录用户就可以进入用户主页各种功能的,所以增加URL拦截器可以解决这个问题。
Django框架本身也有URL拦截器,但是因为本系统用户模型跟Django框架本身用户模型不匹配,所以没有用,只好自定义URL拦截器。
第一步:修改项目配置文件
./mysite/mysite/settings.py:
自定义拦截器中间件放置位置很重要,千万不能放错了,不然无法生效。
'''
将你的自定义拦截器中间件放置在内置的 SessionMiddleware
和 AuthenticationMiddleware 之后,并根据你的实际情况调整其他中间件的顺序。
这样,user 属性应该会被正确添加到请求对象中,
从而解决 'WSGIRequest' object has no attribute 'user' 错误。
'''
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',
# 自定义拦截器
'study_system.custom_middleware.CustomURLInterceptorMiddleware',
'study_system.custom_middleware.CustomURLInterceptorMiddleware2',
]
第二步:新增应用自定义URL拦截器
./mysite/study_system/custom_middleware.py:
import re from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
from django.urls import reverse """
自定义中间件
中间件是一个面向对象的类,有五个方法
1、Request预处理函数:process_request(self, request)
运行时间:在请求后,在process_view 之前,在执行views之前
2、View预处理函数: process_view(self, request, callback, callback_args,callback_kwargs)
运行时间:在process_request之后,在views之前
3、Template模版渲染函数:process_template_response()
运行时间:默认不执行,只有在视图函数的返回结果对象中有render方法才会执行,
并把对象的render方法的返回值返回给用户(注意不返回视图函数的return的结果了,
而是返回视图函数 return值(对象)中rende方法的结果)
4、Exception后处理函数:process_exception(self, request, exception)
运行时间:这个方法只有在 request 处理过程中出了问题
并且view函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,
将现场相关信息输出到日志文件,或者甚至尝试从错误中自动恢复。
5、Response后处理函数:process_response(self, request, response)
运行时间:这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。
该处理器能修改response 的内容;一个常见的用途是内容压缩,如gzip所请求的HTML页面
""" '''
通过中间件(Middleware)来实现自定义的 URL 拦截器。
中间件是 Django 处理请求和响应的组件,可以对请求进行处理、拦截和修改 # 中间件使用方法:
# 方法1、
# --> 首先需要自定义类继承MiddlewareMixin类;然后重写里面的5方法
# --> setting.py中配置自定义中间件类 ''' # 定义需要登录状态的匹配规则,| 分隔要匹配的多个url,从左到右匹配,有匹配就返回匹配值,否则返回None。
login_pattern = r'^(/study_system/home/?$|/study_system/task/|/study_system/item/|/study_system/user/)' class CustomURLInterceptorMiddleware(MiddlewareMixin):
def process_request(self, request):
print('---------------->1')
"""
Request预处理函数,重写方法
"""
# 我们可以通过request对象获取里请求里面的相关值,request对象其实就是view function函数的request
# 相关获取例如:request.META、request.META['REMOTE_HOST']、request.path
print(request.META['REMOTE_ADDR']) # 获取请求的远程地址
path = request.path # 拿到当前的请求路径
# 如果 当前的请求路径h 的开始位置能够找到这个正则样式的任意个匹配,就返回一个相应的匹配对象。
# 如果不匹配,就返回None
match = re.search(login_pattern, path)
if match: # 匹配成功
print(request.user) # AnoymousUser:即匿名对象,未登录
# 如果在,判断请求user认证是否通过,不通过的话我们就直接重定向到登录界面,类似做了一层拦截访问
# if not request.user.is_authenticated:
if not request.session.get('username'):
return redirect(reverse('study_system:login')) class CustomURLInterceptorMiddleware2(MiddlewareMixin):
# 重写方法
def process_request(self, request):
print('------------------->2')
第三步:运行测试查看效果



-------------------------------------------------end -------------------------------------------------
Django实战项目-学习任务系统-自定义URL拦截器的更多相关文章
- Mybatis自定义SQL拦截器
本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...
- Struts2学习:interceptor(拦截器)的使用
对于需要登陆验证.权限验证等功能的网站,每一次请求,每一个action都写一段验证的代码,未免显得冗余且不易维护.struts2提供了拦截器interceptor,为这些页面提供一个切面,或者说公共组 ...
- Dubbo自定义日志拦截器
前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...
- 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
[Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...
- Java开发学习(二十八)----拦截器(Interceptor)详细解析
一.拦截器概念 讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源 (3)如 ...
- SpringMVC 自定义一个拦截器
自定义一个拦截器方法,实现HandlerInterceptor方法 public class FirstInterceptor implements HandlerInterceptor{ /** * ...
- Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例
利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...
- Web Service学习之七:CXF拦截器
一.用途 CXF拦截器类似Struts2的拦截器,后者是拦截和处理请求,前者是对发送和接收的sope消息进行处理,一般用于WS请求响应中的权限验证.日志记录,Soap消息处理,消息的压缩处理等: 这个 ...
- 框架学习之Struts2(四)---拦截器和标签
一.拦截器概述 1.1 在struts2框架中封装了很多功能,struts2里面封装的功能都是在拦截器里面,struts2里面又很多拦截器,但不是每次这些拦截器都执行,每次执行型默认的拦截器. 默认拦 ...
- Struts2学习第四天——拦截器及文件上传
1.概述 Struts2的很多核心功能都是由拦截器完成的. 拦截器很好的实现了AOP的编程思想,在动作的执行之前和结果的返回之后,做拦截处理. 2.struts2的默认拦截器栈 3.自定义拦截器 St ...
随机推荐
- Qt编写地图综合应用9-行政区划
一.前言 行政区划在地图应用中非常有用,行政区划是行政区域划分的简称,是国家为了进行分级管理而实行的区域划分,百度地图提供的内置的函数类支持传入行政区划的名称来获取对应的边界点集合,然后根据该集合来绘 ...
- 利用SDCC开源项目搭建C51编译平台
下载sdcc 安装sdcc 安装sublime 新建编译系统输入以下内容 { "shell_cmd": "sdcc \"${file}\" " ...
- Vue数据更新不渲染页面的问题
一. 问题现象 在通过数组下标的方式修改集合元素,元素的值确实是更新了,但是页面不能重新渲染. 二. 原因分析 Vue官方文档传送门 三. 解决方案 // 针对数组使用 this.$set(arr,i ...
- CDS标准视图:功能位置可用标签 I_FUNCNLLOCALTERNATIVELABEL
视图名称:功能位置可用标签 I_FUNCNLLOCALTERNATIVELABEL 视图类型:基础 视图代码: 点击查看代码 @EndUserText.label: 'Functional Locat ...
- Linux 常用脚本命令-lsof、find、rpm、SS、top、vim
1,关机命令 1 shutdown -h now/0 2 halt 3 init 0 4 poweroff 5 举例: 6 shutdown -h 3 ------3分钟后关机(可用shutdown ...
- 节点和IP节点和IP
先说一下我们的IP分配和服务的规划信息 节点和IP 节点 IP ha01 11.53.103.50 ha02 11.53.103.49 ha03 11.53.103.48 ha04 11.53.103 ...
- 利用坦克PWA3快速为应用配置域名:以Gogs为例
全文概述 本文介绍了如何利用坦克PWA3平台快速为Gogs应用配置域名的过程.随着互联网技术的发展,自托管Git服务变得越来越受欢迎,其中Gogs凭借其轻量级和易于安装的特点受到众多开发者的青睐.为提 ...
- 国际“论”剑!天翼云数据库论文被EDBT收录!
近日,由天翼云数据库团队.中国电信云计算研究院和深圳北理莫斯科大学合作完成的<Taste: Towards Practical Deep Learning-based Approaches fo ...
- SDN网络技术在云计算中的应用
本文分享自天翼云开发者社区<SDN网络技术在云计算中的应用>,作者:1****m SDN(软件定义网络)是一种新型的网络架构,其基本思想是将数据平面和控制平面分离,通过集中式的控制器来管理 ...
- flutter-路由传值携带中文时,报错
解决方案: 路由采用了第三方:fluro 1 Application.router.navigateTo(context, "/searchresult?word=${Uri.encodeC ...