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


    接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。

    首先增加URL拦截器,你不会希望没有登录用户就可以进入用户主页各种功能的,所以增加URL拦截器可以解决这个问题。

    Django框架本身也有URL拦截器,但是因为本系统用户模型跟Django框架本身用户模型不匹配,所以没有用,只好自定义URL拦截器。

    第一步:修改项目配置文件

    ./mysite/mysite/settings.py:

    自定义拦截器中间件放置位置很重要,千万不能放错了,不然无法生效。

    1. '''
    2. 将你的自定义拦截器中间件放置在内置的 SessionMiddleware
    3. 和 AuthenticationMiddleware 之后,并根据你的实际情况调整其他中间件的顺序。
    4. 这样,user 属性应该会被正确添加到请求对象中,
    5. 从而解决 'WSGIRequest' object has no attribute 'user' 错误。
    6. '''
    7. MIDDLEWARE = [
    8. 'django.middleware.security.SecurityMiddleware',
    9. 'django.contrib.sessions.middleware.SessionMiddleware',
    10. 'django.middleware.common.CommonMiddleware',
    11. 'django.middleware.csrf.CsrfViewMiddleware',
    12. 'django.contrib.auth.middleware.AuthenticationMiddleware',
    13. 'django.contrib.messages.middleware.MessageMiddleware',
    14. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
    15. # 自定义拦截器
    16. 'study_system.custom_middleware.CustomURLInterceptorMiddleware',
    17. 'study_system.custom_middleware.CustomURLInterceptorMiddleware2',
    18. ]

    第二步:新增应用自定义URL拦截器

    ./mysite/study_system/custom_middleware.py:

    1. import re
    2. from django.shortcuts import redirect
    3. from django.utils.deprecation import MiddlewareMixin
    4. from django.urls import reverse
    5. """
    6. 自定义中间件
    7. 中间件是一个面向对象的类,有五个方法
    8. 1、Request预处理函数:process_request(self, request)
    9. 运行时间:在请求后,在process_view 之前,在执行views之前
    10. 2、View预处理函数: process_view(self, request, callback, callback_args,callback_kwargs)
    11. 运行时间:在process_request之后,在views之前
    12. 3、Template模版渲染函数:process_template_response()
    13. 运行时间:默认不执行,只有在视图函数的返回结果对象中有render方法才会执行,
    14. 并把对象的render方法的返回值返回给用户(注意不返回视图函数的return的结果了,
    15. 而是返回视图函数 return值(对象)中rende方法的结果)
    16. 4、Exception后处理函数:process_exception(self, request, exception)
    17. 运行时间:这个方法只有在 request 处理过程中出了问题
    18. 并且view函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,
    19. 将现场相关信息输出到日志文件,或者甚至尝试从错误中自动恢复。
    20. 5、Response后处理函数:process_response(self, request, response)
    21. 运行时间:这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。
    22. 该处理器能修改response 的内容;一个常见的用途是内容压缩,如gzip所请求的HTML页面
    23. """
    24. '''
    25. 通过中间件(Middleware)来实现自定义的 URL 拦截器。
    26. 中间件是 Django 处理请求和响应的组件,可以对请求进行处理、拦截和修改
    27. # 中间件使用方法:
    28. # 方法1、
    29. # --> 首先需要自定义类继承MiddlewareMixin类;然后重写里面的5方法
    30. # --> setting.py中配置自定义中间件类
    31. '''
    32. # 定义需要登录状态的匹配规则,| 分隔要匹配的多个url,从左到右匹配,有匹配就返回匹配值,否则返回None。
    33. login_pattern = r'^(/study_system/home/?$|/study_system/task/|/study_system/item/|/study_system/user/)'
    34. class CustomURLInterceptorMiddleware(MiddlewareMixin):
    35. def process_request(self, request):
    36. print('---------------->1')
    37. """
    38. Request预处理函数,重写方法
    39. """
    40. # 我们可以通过request对象获取里请求里面的相关值,request对象其实就是view function函数的request
    41. # 相关获取例如:request.META、request.META['REMOTE_HOST']、request.path
    42. print(request.META['REMOTE_ADDR']) # 获取请求的远程地址
    43. path = request.path # 拿到当前的请求路径
    44. # 如果 当前的请求路径h 的开始位置能够找到这个正则样式的任意个匹配,就返回一个相应的匹配对象。
    45. # 如果不匹配,就返回None
    46. match = re.search(login_pattern, path)
    47. if match: # 匹配成功
    48. print(request.user) # AnoymousUser:即匿名对象,未登录
    49. # 如果在,判断请求user认证是否通过,不通过的话我们就直接重定向到登录界面,类似做了一层拦截访问
    50. # if not request.user.is_authenticated:
    51. if not request.session.get('username'):
    52. return redirect(reverse('study_system:login'))
    53. class CustomURLInterceptorMiddleware2(MiddlewareMixin):
    54. # 重写方法
    55. def process_request(self, request):
    56. print('------------------->2')


    第三步:运行测试查看效果

    -------------------------------------------------end -------------------------------------------------

  • 相关阅读:
    PicoRV32-on-PYNQ-Z2: An FPGA-based SoC System——RISC-V On PYNQ项目复现
    如何克服答辩恐惧:从心理准备到实际应对
    java手机游戏堡垒的设计与开发免费源代码+LW
    OpenText 安全取证软件——降低成本和风险的同时,简化电子取证流程
    Java开发过程中常用Linux命令总结
    动态数组的插入、删除、统计、打印
    sqli-labs(Less-5) updatexml闯关
    基于springboot的海鲜特产商城
    经典OJ题:找环节点——代码解析
    胶原蛋白酶——Worthington四种类型的粗胶原酶
  • 原文地址:https://blog.csdn.net/xionghui2007/article/details/134165290