django2.0后,配置中间件的一些变化

在视频学习Django框架过程中,中间件配置与1.x不同。
在此记录下,怕以后给忘了

Setting.py 配置文件中,MIDDLEWARE_CLASSES元组改名为MIDDLEWARE。

出错的代码:

from django.http import HttpResponse
class BlockedIPSMiddleWare(object):
    '''中间件类'''
    #禁止ip列表
    EXCLUDE_IPS=['172.162.222.13']

    def process_view(self,request,view_fun,*view_args,**view_kwargs):
        '''视图函数调用前会调用'''
        # 获取游览器的ip地址
        user_ip = request.META['REMOTE_ADDR']
        # print(user_ip)
        if user_ip in BlockedIPSMiddleWare.EXCLUDE_IPS:
            return HttpResponse('<h1>Forbidden</h1>')

错误信息:

File "D:\PyCharm\PyCharmWorkSpace\djangotest\venv\lib\site-packages\django\core\wsgi.py", line 13, in get_wsgi_application
    return WSGIHandler()
  File "D:\PyCharm\PyCharmWorkSpace\djangotest\venv\lib\site-packages\django\core\handlers\wsgi.py", line 136, in __init__
    self.load_middleware()
  File "D:\PyCharm\PyCharmWorkSpace\djangotest\venv\lib\site-packages\django\core\handlers\base.py", line 36, in load_middleware
    mw_instance = middleware(handler)
TypeError: object() takes no parameters

参考博客与文档修改后正确代码:

from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class BlockedIPSMiddleWare(MiddlewareMixin):
    '''中间件类'''
    #禁止ip列表
    EXCLUDE_IPS=['172.162.222.13']

    def process_view(self,request,view_fun,*view_args,**view_kwargs):
        '''视图函数调用前会调用'''
        # 获取游览器的ip地址
        user_ip = request.META['REMOTE_ADDR']
        # print(user_ip)
        if user_ip in BlockedIPSMiddleWare.EXCLUDE_IPS:
            return HttpResponse('<h1>Forbidden</h1>')

据说还能这么写:

class BlockedIPSMiddleWare(object):
    '''中间件类'''
    #禁止ip列表
    EXCLUDE_IPS=['172.162.222.13']

    def __init__(self, get_response):

        self.get_response = get_response
    
    def __call__(self, request):
        return self.get_response(request)

    def process_view(self,request,view_fun,*view_args,**view_kwargs):
        '''视图函数调用前会调用'''
        # 获取游览器的ip地址
        user_ip = request.META['REMOTE_ADDR']
        # print(user_ip)
        if user_ip in BlockedIPSMiddleWare.EXCLUDE_IPS:
            return HttpResponse('<h1>Forbidden</h1>')

记录一下中间件的实现方法:

_init _:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件
process_request(request):执行视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
process_view(request, view_func, view_args, view_kwargs):调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
process_template_response(request, response):在视图刚好执行完毕之后被调用,在每个请求上调用,返回实现了render方法的响应对象
process_response(request, response):所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象
process_exception(request,response,exception):当视图抛出异常时调用,在每个请求上调用,返回一个HttpResponse对象

猜你喜欢

转载自blog.csdn.net/BAIXU_/article/details/83961891