django2.0後,配置中介軟體的一些變化
阿新 • • 發佈:2018-12-20
在視訊學習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物件