Django decorator_from_middle type_error - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь исключить промежуточное ПО из некоторых представлений в Django, и у меня возникла проблема.
Это класс промежуточного ПО

class JWTAuthorisation(object):

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # before view
        token = request.headers.get('x-auth-token')
        if not token:
            return HttpResponse("No access token provided", status=401)

        response = self.get_response(request)
        return response

Я использую этот @ для включения промежуточного ПО для просмотра

  @decorator_from_middleware(JWTAuthorisation)
  def register(request):
    if request.method == "POST":

Это ошибка

 File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "E:\LoreProject\users\urls.py", line 3, in <module>
    from users import views
  File "E:\LoreProject\users\views.py", line 75, in <module>
    @decorator_from_middleware(JWTAuthorisation)
  File "E:\LoreProject\venv\lib\site-packages\django\utils\decorators.py", line 111, in decorator_from_middleware
    return make_middleware_decorator(middleware_class)()
  File "E:\LoreProject\venv\lib\site-packages\django\utils\decorators.py", line 116, in _make_decorator
    middleware = middleware_class(*m_args, **m_kwargs)
TypeError: __init__() missing 1 required positional argument: 'get_response'

Обновление Я изменил свой класс на

class JWTAuthorisation(object):

   def process_request(self,request):
       print("hello")
       return None

Я получаю это

 File "E:\LoreProject\venv\lib\site-packages\django\core\wsgi.py", line 13, in get_wsgi_application
    return WSGIHandler()
  File "E:\LoreProject\venv\lib\site-packages\django\core\handlers\wsgi.py", line 127, in __init__
    self.load_middleware()
  File "E:\LoreProject\venv\lib\site-packages\django\core\handlers\base.py", line 37, in load_middleware
    mw_instance = middleware(handler)
TypeError: object() takes no parameters

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Хорошо, поэтому ошибка была такой:
середина была установлена ​​в настройках, и я хотел исключить ее. Так что, если удалить middlle из settings.py и изменить средний на стиль 1.9 django, это будет работать. Спасибо!

0 голосов
/ 31 марта 2020

Из документов для decorator_from_middleware

Для данного класса промежуточного программного обеспечения возвращается декоратор вида. Это позволяет вам использовать функциональность промежуточного программного обеспечения отдельно для каждого представления. Промежуточное программное обеспечение создано без переданных параметров.

Предполагается, что промежуточное программное обеспечение совместимо со старым стилем Django 1.9 и более ранними (с такими методами, как process_request (), process_exception () и process_response ()).

Ваше промежуточное ПО должно быть "старого стиля"

...