Django实战项目-学习任务系统-自定义URL拦截器-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

接着上期代码框架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 -------------------------------------------------

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go

“Django实战项目-学习任务系统-自定义URL拦截器-CSDN博客” 的相关文章