在视频学习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对象