码迷,mamicode.com
首页 > 其他好文 > 详细

django--中间件

时间:2020-12-09 12:08:57      阅读:5      评论:0      收藏:0      [点我收藏+]

标签:css_   方向   服务器   shortcut   value   white   not   直接   cut   

中间件的应用场景:

1, 做ip访问频率限制: 某些ip访问服务器的频率过高,进行拦截, 比如每分钟不能超过20次
2, url访问过滤: 如果用户访问的是login(登录)或者register(注册)之类的就放过,
    如果访问其他视图, 需要检测是不是有session认证, 已经有了就放行, 
    没有就返回login, 这样就省得在多个视图函数上写装饰器了

流程

中间件: 1,先走所有的process_request,
2,再找url,
3,再走所有的process_view,
4, 再继续执行url对应的视图函数
5, 如果执行url对应的视图函数出错, 就执行中间件process_exception(反方向执行)
4, 再走所有的process_response(反方向执行)

###  如何使用中间件

对所有请求和响应做一些统一处理
自定义中间件的流程
1, 在应用中创建一个py文件, 比如mymiddleware.py
2, 文件中书写内容如下, 先要引入模块

from django.shortcuts import redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin
# 登录认证中间件
class loginAuth(MiddlewareMixin):
    # 白名单
    white_list = [‘/login/‘,‘register‘]

    # 对请求处理用process_request, 如果请求通过了处理, 就return None(就是可以继续往下执行), 如果没有通过直接return Httpresponse对象, 可以直接返回
    def process_request(self,request):
        current_path = request.path # 可以直接获取到用户请求的路径
        # 判断用户请求路径是否在白名单中,
        if current_path not in self.white_list:
            status = request.session.get(‘is_login‘) # 获取到session值
            if not status: # 判断, 如果没有session值, 就给他字符串提示,或者重定向去登录
                # return HttpResponse(‘去登录吧‘)
                return redirect(‘login‘)
            print(‘请求正常通行‘)# 如果获取到session, 就给用户请求的路径通行








class Md1(MiddlewareMixin):
    def process_request(self,request):

        print(‘Md1-process_request‘)
        # return HttpResponse(‘ojbk‘) #process_requestzhong中如果returnhttpresponse对象, 那么中间件执行到这里直接返回


    def process_response(self,request,response):
        print(response)#<HttpResponse status_code=200, "text/html; charset=utf-8">
        print(‘Md1-process_request‘)

        # 获取到httpresponse的最终返回值或者html文件(都是字节流类型), 可以decode成字符串, 如果是html页面, 则会展示html代码
        print(response.content.decode())

        response[‘xx‘] = ‘oo‘
        # return HttpResponse(‘ok‘) # 如果return是HTTPResponse对象, 那么替换视图函数中的返回值

        return response #注意 使用process_response一定要return response, 否则报错

    def process_view(self,request,view_func,view_args,view_kwargs):
        print(‘Md1-process_view‘)
        print(view_func, view_args,view_kwargs)
        print(‘Md1-process_view2‘)

    def process_exception(self,request,exception):
        print(‘Md1-process_exception‘)
        print(exception, type(exception))# 收集到报错信息, 可以做处理, 预防服务器故障

        # 统一做异常处理
        if isinstance(exception,ValueError):
            return HttpResponse(‘有函数报错了,请及时处理‘,status=500)




class Md2(MiddlewareMixin):
    def process_request(self,request):
        print(‘Md2-procss_request‘)

    def process_response(self,quest,response):
        print(‘Md2-process_response‘)
        return response

    def process_view(self,request,view_func,view_args,view_kwargs):
        print(‘Md2-process_view‘)


    def process_exception(self,request,exception):
        print(‘Md2-process_exception‘)


    # 还有一个中间件, 很少用到
    def process_template_response(self,request,response):
        pass

技术图片

技术图片

django--中间件

标签:css_   方向   服务器   shortcut   value   white   not   直接   cut   

原文地址:https://www.cnblogs.com/-szh/p/14088073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!