使用@decorator_from_middleware时无法导入自定义中间件。 (非全球中间件)

时间:2018-10-22 10:22:19

标签: python django middleware

我正在使用一些自定义中间件来检查用户的身份验证。这很好用,但是我不想在每个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

1 个答案:

答案 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 *仍然不是一个好主意)。