django自定义中间件--------登录验证中间件

django自带的七个中间件

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',]

 1.介绍

1.当请求来的时候,先经过中间件的过滤

2.响应走了最后,也要经过中间件

2.django的中间件给我们暴露了一些方法

class SessionMiddleware(MiddlewareMixin):
    def process_request(self,request)   #请求过来时,会触发process_request方法,
    def process_response(self, request, response): #响应有的时候,会触发process_pesponse方法
还有
    process_view----------------》是跟视图函数相关的
    process_exception----------------》跟异常相关的
    process_template_response----------------》跟模板相关的
# 在一个中间件中,暴露的这几个方法不是每个类都必须有的,而是需要什么就写什么

自定义中间件

from django.utils.deprecation import MiddlewareMixin

定义一个类,必须继承MiddlewareMixin,类名要符合命名规范

然后就是重写方法

        def process_request(self, request):

        def process_response(self, request, response):

        process_view----------------》是跟视图函数相关的
         process_exception----------------》跟异常相关的
         process_template_response----------------》跟模板相关的

# 在一个中间件中,暴露的这几个方法不是每个类都必须有的,而是需要什么就写什么

举个列子----在自定义中间件实现认证登录

重新建一个文件夹,建一个py文件

from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin

from django.conf import settings


class Mylogins(MiddlewareMixin):

    def process_request(self, request):
        path_a=request.path_info    #获取请求url的后缀,/index/
        if path_a not in settings.WHITE_LIST:   #判断路径是否在这个白名单中
            user_obj = request.session.get('user')    #在登录后,设置session
            if not user_obj:      #不存在   就重定向到登陆页面
                return redirect('login')
            pass

settings.py配置白名单

#白名单
WHITE_LIST = ['/reg/', '/login/', '/get_code/','/home/']

最后一定要在配置文件中,注册你的中间件

中间件问题

# 针对process_reqeust
    1. 执行顺序是按照配置文件中注册的顺序,从上往下依次执行
    2. 视图函数在中间件的process_reqeust函数之后执行
    3. 如果在process_reqeust里面直接返回HttpResponse,之后的中间件一律不在走了,包括视图函数
# # 针对process_response
     1. 必须要返回一个HttpResponse
    2. 执行顺序:是按照配置文件的注册顺序,从下往上依次执行

# 最后一个问题:
研究我在第一个中间件的process_reqeust方法中,直接返回HttpResponse,然后,观察所有中间件的process_response的执行顺序?
# 结论:如果在第一个中间件中得process_reqeust中直接拦截,只走第一个中间件的process_reqeust和第一个中间件的process_response,直接原路返回.

# 但是,在flask框架中,如果你在第一个拦截了,后面的类似于是process_response都会走一遍.
'''flask框架中实际上没有真正的中间件,它是需要你看源码自己做成类似于django的这种中间件'''

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值