最近遇到一个权限相关的需求,要判断用户有没有当前接口的权限,打算放到中间件中判断,权限判断方法都直接写在了中间件类中。
在自定义中间件中,调用current_url的时候遇到了线程安全问题。
class PermissionMiddleware(MiddlewareMixin):
def __call__(self, request):
self.request = request
return super().__call__(request)
@property
def current_url(self):
"""
当前url
@return:
"""
return str(self.request.path_info).strip()
def process_request(self, request):
pass
...
看了一下MiddlewareMixin源码,他的__init__方法全局只会调用一次,所以上面的current_url可能并不是当前访问的url
class MiddlewareMixin:
def __init__(self, get_response=None):
self.get_response = get_response
super().__init__()
def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
response = response or self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
解决: 单独写个类判断权限
class PermissionMiddleware(MiddlewareMixin):
def __call__(self, request):
self.request = request
return super().__call__(request)
def process_request(self, request):
check_perm = CheckPermissioin(request)
...
class CheckPermissioin():
"""
判断有没有当前接口权限
"""
def __init__(self, request):
self.request = request
@property
def current_url(self):
"""
当前url
@return:
"""
return str(self.request.path_info).strip()
...



