Post

django 클래스 메소드 오류

as_view() 메소드 오류

django 클래스 메소드 오류

오류내용

1
AttributeError: type object 'CustomOAuth2CallbackView' has no attribute 'as_view'

문제코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class CustomOAuth2CallbackView(OAuth2CallbackView):
    adapter_class = GoogleOAuth2Adapter

    def get_adapter(self, request):
        return self.adapter_class(request)

    def dispatch(self, request, *args, **kwargs):
        try:
            self.adapter = self.get_adapter(request)  # adapter 인스턴스를 설정
            return super().dispatch(request, *args, **kwargs)
        except Exception as e:
            logger.error(f"OAuth2CallbackView error: {e}")
            messages.error(request, "An error occurred during authentication. Please try again.")
            return render_authentication_error(request)

코드에는 문제가 없었으나 상속받는 OAuth2CallbackView 클래스 파일을 열어보니 OAuth2CallbackView 클래스가 상속하는 OAuth2View클래스가 문제였음

변경 전

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class OAuth2View(object):
    @classmethod
    def adapter_view(cls, adapter):
        def view(request, *args, **kwargs):
            self = cls()
            self.request = request
            if not isinstance(adapter, OAuth2Adapter):
                self.adapter = adapter(request)
            else:
                self.adapter = adapter
            try:
                return self.dispatch(request, *args, **kwargs)
            except ImmediateHttpResponse as e:
                return e.response

        return view

변경 후

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from django.views import View

class OAuth2View(View):
    @classmethod
    def adapter_view(cls, adapter):
        def view(request, *args, **kwargs):
            self = cls()
            self.request = request
            if not isinstance(adapter, OAuth2Adapter):
                self.adapter = adapter(request)
            else:
                self.adapter = adapter
            try:
                return self.dispatch(request, *args, **kwargs)
            except ImmediateHttpResponse as e:
                return e.response

        return view
This post is licensed under CC BY 4.0 by the author.