1. 程式人生 > >django2.0後,配置中介軟體的一些變化

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物件