【问题标题】:Can't import custom Middleware whilst using @decorator_from_middleware. (Non Global Middleware)使用 @decorator_from_middleware 时无法导入自定义中间件。 (非全局中间件)
【发布时间】:2018-10-22 10:22:19
【问题描述】:

我正在使用一些自定义中间件来检查用户的身份验证。这很好用,但我不想在每个 url 上运行这个中间件。

Suggestions 指向使用@decorator_from_middleware 在您希望中间件运行的每个视图之前,这将是理想的。我的一些观点应该是全球性的,而另一些则落后于身份验证。

我似乎无法导入中间件以在视图文件中调用它。

我的意见.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

【问题讨论】:

    标签: python django middleware


    【解决方案1】:

    这是标准的 Python 行为。除非你在myapp.middleware的__init__.py中显式导入AuthCheckMiddleware,否则from myapp.middleware import *不会导入。

    但实际上,无论如何你都不应该这样做。很少有充分的理由去做import *;始终明确导入您需要的东西。

    from myapp.middleware.authCheck import AuthCheckMiddleware
    

    另请注意,Python 样式适用于具有小写字母和下划线名称的模块:它应该是 auth_check.py。

    还请注意,Python 确实要求或期望每个类都位于单独的文件中,因此您可以让 myapp/middleware.py 包含多个类,包括 AuthCheckMiddleware。那么你的原始代码就可以工作了(尽管使用 import * 仍然不是一个好主意)。

    【讨论】:

    • 感谢 Daniel,我现在可以导入课程了。提示赞赏。我现在有另一个问题,TypeError: __init__() missing 1 required positional argument: 'get_response。我在 settings.py 中使用了新的 MIDDLEWARE 设置,我从 Django Doc class AuthCheckMiddleware(object): def __init__(self, get_response): self.get_response = get_response 复制了类结构
    • 您能解释一下为什么不使用existing auth decorators 之一,例如login_requireduser_passes_test
    • 我没有使用login_required,因为我不希望所有 sso 用户都能够访问某些页面。但是 user_passes_test 听起来它可以在不使用中间件的情况下解决我的问题。我只需要在我想限制的每个视图上调用它。谢谢
    猜你喜欢
    • 2018-01-14
    • 2021-07-03
    • 2011-02-24
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多