我正在使用一些自定义中间件来检查用户的身份验证。这很好用,但是我不想在每个URL上都运行此中间件。
Suggestions指向使用@decorator_from_middleware
在要运行中间件的每个视图之前,这是理想的。我的某些观点应该是全球性的,而其他观点应该在auth之后。
我似乎无法导入中间件在视图文件中调用它。
我的views.py:
from myapp.middleware import *
@decorator_from_middleware(AuthCheckMiddleware)
def index(request):
return render(request, "index.html")
我的myapp.middleware.authCheck.py:
class AuthCheckMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
#CHECK AUTH HERE
response = self.get_response(request)
return response
def process_exception(self, request, exception):
return None
我得到的错误:
File "/vagrant/myapp/django-project/isadmin/web/views.py", line 93, in <module>
@decorator_from_middleware(AuthCheckMiddleware)
NameError: name 'AuthCheckMiddleware' is not defined
答案 0 :(得分:1)
这是标准的Python行为。除非您在myapp.middleware的__init__.py
中明确导入AuthCheckMiddleware,否则from myapp.middleware import *
不会导入它。
但是实际上您绝对不应该这样做。很少有充分的理由要做import *
;始终明确导入您需要的东西。
from myapp.middleware.authCheck import AuthCheckMiddleware
还请注意,Python样式用于模块具有lower_case_with_underscore名称:应该为auth_check.py。
还请注意,Python不需要或不需要每个类都在单独的文件中,因此您可能拥有包含多个类(包括AuthCheckMiddleware)的myapp / middleware.py。这样您的原始代码就可以了(尽管使用import *仍然不是一个好主意)。