Невозможно импортировать пользовательское промежуточное ПО, используя @decorator_from_middleware.(Non Global Middleware) - PullRequest
0 голосов
/ 22 октября 2018

Я использовал какое-то пользовательское промежуточное ПО для проверки аутентификации пользователей.Это работало замечательно, но я не хочу запускать это промежуточное ПО на каждом URL.

Предложения указывают на использование @decorator_from_middleware перед каждым представлением, для которого вы хотите запустить промежуточное ПО, это было бы идеально.Некоторые из моих представлений должны быть глобальными, другие за аутентификацией.

Я не могу импортировать промежуточное программное обеспечение для вызова его в файле представлений.

Мои views.py:

from myapp.middleware import *

@decorator_from_middleware(AuthCheckMiddleware)
def index(request):
    return render(request, "index.html")

My 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 голосов
/ 22 октября 2018

Это стандартное поведение Python.Если вы явно не импортируете AuthCheckMiddleware в __init__.py myapp.middleware, он не будет импортирован from myapp.middleware import *.

Но на самом деле вы никогда не должны этого делать.Очень редко есть веская причина сделать import *;всегда импортируйте вещи, которые вам нужны явно.

from myapp.middleware.authCheck import AuthCheckMiddleware

Также обратите внимание, что стиль Python предназначен для модулей с именами lower_case_with_underscore: это должно быть auth_check.py.

Также обратите внимание, что Python делает not требует или ожидает, что каждый класс будет в отдельном файле, поэтому вы можете иметь myapp / middleware.py, содержащий несколько классов, включая AuthCheckMiddleware.Тогда ваш оригинальный код сработал бы (хотя по-прежнему не очень хорошая идея использовать импорт *).

...