Django:自定义中间件导致 NoneType 错误
Django: Custom Middleware results in NoneType Error
我收到这个错误:
内部服务器错误: /
追溯(最近一次通话):
文件“/home/cena/AjiiMajii/.venv/local/lib/python2.7/site-packages/django/core/handlers/exception.py”,第 41 行,在内部
响应 = get_response(请求)
文件“/home/cena/AjiiMajii/.venv/local/lib/python2.7/site-packages/django/utils/deprecation.py”,第 142 行,在 __call__ 中
响应 = self.process_response(请求,响应)
文件“/home/cena/AjiiMajii/.venv/local/lib/python2.7/site-packages/django/middleware/clickjacking.py”,第 32 行,在 process_response 中
如果 response.get('X-Frame-Options') 不是 None:
AttributeError: 'NoneType' 对象没有属性 'get'
[04/Dec/2017 20:08:25] "GET / HTTP/1.1" 500 65880
我的中间件是:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'cms.Middleware.Visits',
]
</pre>
和我的自定义中间件'cms.Middleware.Visits'
class Visits(MiddlewareMixin):
def __init__(self,get_response):
self.get_response = get_response
def __call__(self, request):
print '*'*22
print self.get_client_ip(request)
print '*'*22
def get_client_ip(self,request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[-1].strip()
else:
ip = request.META.get('REMOTE_ADDR')
return ip
def RedisConnection(self):
Connection=redis.Redis(host='localhost',port='6379')
self.Connection=Connection
return self.Connection
def IpCheker(self):
# just set and count of visit[s] for ever ip
print '%'*30
print self.get_client_ip()
print '%'*30
self.RedisConnection()
if self.Connection.get(self.CliReq):
HashPattern=self.HashSetter(self.CliReq)
UserId=self.Connection.get(self.CliReq)
UserPattern="User:Id:{}".format(UserId)
print UserPattern
self.Connection.hincrby(UserPattern,'vcount')
else:
IDnum=self.IdGenerator(self.CliReq)
self.Connection.set(self.CliReq,IDnum)
HashPattern=self.HashSetter(self.CliReq)
Location=self.GetLoc(self.CliReq)
self.Connection.hset(HashPattern,'ip',self.CliReq)
self.Connection.hset(HashPattern,'vcount',1)
self.Connection.hset(HashPattern,'loc',Location)
def HashSetter(self,ip):
id=self.IdGenerator(ip)
IdStyle='User:Id:{}'.format(id)
return IdStyle
def IdGenerator(self,ip):
Count=self.Connection.keys('User:Id:*')
id= len(Count) + 1
return id
def GetLoc(self,ip):
#GetLocation oF ip's
print 'f' * 80
ApiLoc='http://www.freegeoip.net/json/'
ABSLOC=requests.get('http://www.freegeoip.net/json/{}'.format(ip))
LocInfo=json.loads(ABSLOC.content)
return LocInfo['country_name']
</pre>
我无法解决或调试这个问题,
为什么会这样?
我认为在中间件 调用 方法中你应该 return 响应。请查看文档以供参考:
错误似乎发生了,因为您没有在 call() 方法中 return 响应。
我收到这个错误:
内部服务器错误: / 追溯(最近一次通话): 文件“/home/cena/AjiiMajii/.venv/local/lib/python2.7/site-packages/django/core/handlers/exception.py”,第 41 行,在内部 响应 = get_response(请求) 文件“/home/cena/AjiiMajii/.venv/local/lib/python2.7/site-packages/django/utils/deprecation.py”,第 142 行,在 __call__ 中 响应 = self.process_response(请求,响应) 文件“/home/cena/AjiiMajii/.venv/local/lib/python2.7/site-packages/django/middleware/clickjacking.py”,第 32 行,在 process_response 中 如果 response.get('X-Frame-Options') 不是 None: AttributeError: 'NoneType' 对象没有属性 'get' [04/Dec/2017 20:08:25] "GET / HTTP/1.1" 500 65880
我的中间件是:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'cms.Middleware.Visits', ] </pre>
和我的自定义中间件'cms.Middleware.Visits'
class Visits(MiddlewareMixin): def __init__(self,get_response): self.get_response = get_response def __call__(self, request): print '*'*22 print self.get_client_ip(request) print '*'*22 def get_client_ip(self,request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[-1].strip() else: ip = request.META.get('REMOTE_ADDR') return ip def RedisConnection(self): Connection=redis.Redis(host='localhost',port='6379') self.Connection=Connection return self.Connection def IpCheker(self): # just set and count of visit[s] for ever ip print '%'*30 print self.get_client_ip() print '%'*30 self.RedisConnection() if self.Connection.get(self.CliReq): HashPattern=self.HashSetter(self.CliReq) UserId=self.Connection.get(self.CliReq) UserPattern="User:Id:{}".format(UserId) print UserPattern self.Connection.hincrby(UserPattern,'vcount') else: IDnum=self.IdGenerator(self.CliReq) self.Connection.set(self.CliReq,IDnum) HashPattern=self.HashSetter(self.CliReq) Location=self.GetLoc(self.CliReq) self.Connection.hset(HashPattern,'ip',self.CliReq) self.Connection.hset(HashPattern,'vcount',1) self.Connection.hset(HashPattern,'loc',Location) def HashSetter(self,ip): id=self.IdGenerator(ip) IdStyle='User:Id:{}'.format(id) return IdStyle def IdGenerator(self,ip): Count=self.Connection.keys('User:Id:*') id= len(Count) + 1 return id def GetLoc(self,ip): #GetLocation oF ip's print 'f' * 80 ApiLoc='http://www.freegeoip.net/json/' ABSLOC=requests.get('http://www.freegeoip.net/json/{}'.format(ip)) LocInfo=json.loads(ABSLOC.content) return LocInfo['country_name'] </pre>
我无法解决或调试这个问题, 为什么会这样?
我认为在中间件 调用 方法中你应该 return 响应。请查看文档以供参考:
错误似乎发生了,因为您没有在 call() 方法中 return 响应。