Как вызвать другие методы в классе в django, когда self не указан в качестве аргумента

Я пришел из PHP/Laravel Background, где для вызова методов или доступа к свойствам внутри класса достаточно использовать ключевое слово $this. В python3/Django4.0.6 я должен использовать request в качестве первого параметра для получения тела запроса. например,

class CustomAuth:

      def verifyToken(token):
          pass

      def login(request):
          data = request.body
          # how do i call verifyToken?
          # if i use self as first argument then i am not able to access the request

Это было бы относительно стандартно, исходя из того, о чем вы спрашиваете:

class CustomAuth:

      def verifyToken(self, token):
          self.token = token
        

      def login(self, request):
            self.request = request
            data = request.body

            
            # how do i call verifyToken?
            x = self.verifyToken(self.token)
            # if i use self as first argument then i am not able to access the request
            r = self.request


Также обратите внимание на комментарии, предлагающие метод @staticmethod в качестве альтернативы.

Смысл "self" в том, чтобы связать функции и переменные с экземпляром. Если ваша функция не использует внутренние переменные класса или другие функции, вы можете украсить ее @staticmethod и будете обращаться к ней как обычно.

Для получения более подробной информации погуглите. https://www.w3schools.com/python/gloss_python_self.asp#:~:text=The%20self%20parameter%20is%20a,that%20belongs%20to%20the%20class.

Мне кажется странным то, как вы используете класс. Почему бы вам не инстанцировать класс с параметром token, и не использовать функцию для присвоения token внутренней переменной класса.

Спасибо всем! Проблема была в том, что я не инстанцировал класс AuthService. Ранее мой urls.py для этого модуля auth выглядел так

from django.urls import path

from .service import AuthService

urlpatterns = [
    path('login',AuthService.login,name='login'),
    
   
]

, который я изменил на следующий

from django.urls import path

from .service import AuthService

auth = AuthService()

urlpatterns = [
    path('login',auth.login,name='login'),
    
   
]

теперь это работает нормально

def login(self, request):
Вернуться на верх