django view를 만들때 drf에서 제공하는 APIView를 상속받지 않고 django에서 내장된 기본 View를 상속받는 경우에 drf에서 제공하는 authentication은 작동하지 않는다.
drf를 항상 사용하던사람들은 아무런 의구심이 없을지 모르겠으나, drf에서 어떤식으로 authentication이 처리되는지 궁금할수 있을듯하여 실제 코드를 가져와봤다.
dispatch코드가 APIView에서는 오버라이딩 된것을 확인할수 있는데,
View에서는 없던 initialize_request라는 함수가 실행되는 것을 확인할 수 있다.
해당 함수에서 request를 초기화하고, 그 과정에서 authentication 처리가 정상적으로 된다.
따라서 VIew 함수를 상속한 경우에는 authentication을 위한 별도의 코드가 없기 때문에 유저가 따로 처리해주던가, drf를 통해서 처리하거나 해야된다.
drf가 해주는구나 하고 넘어가면 아무 생각 없이 넘어갈수 있는 부분이나, View를 상속받지 않고 JSONResponse를 반환하는 함수로 api를 만들었을때에 request.user가 계속 Anonymous로 나와서 조금 생각해보고 찾다보니, 당연한 이유였다는걸 알수 있었따..
나는 인증을 위해너 dj-rest-auth를 사용하는데 이것 또한 drf를 기반으로 만들어져있고, JWT로 인증 유무를 판단하는데 JWT는 restframework-simplejwt 이게 또 drf를 기반으로 만들어져있다..ㅎ 그래서 어찌되었던 인증처리를 직접 구현하지 않는 이상 drf의 APIView 클래스를 상속받아 처리해줘야 기본 인증 클래스가 포함되어 인증처리가 정상적으로 되는거다..
venv\Lib\site-packages\django\views\generic\base.py
class View:
...
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(
self, request.method.lower(), self.http_method_not_allowed
)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
venv\Lib\site-packages\rest_framework\views.py
class APIView(View):
...
def dispatch(self, request, *args, **kwargs):
"""
`.dispatch()` is pretty much the same as Django's regular dispatch,
but with extra hooks for startup, finalize, and exception handling.
"""
self.args = args
self.kwargs = kwargs
request = self.initialize_request(request, *args, **kwargs)
self.request = request
self.headers = self.default_response_headers # deprecate?
try:
self.initial(request, *args, **kwargs)
# Get the appropriate handler method
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
response = handler(request, *args, **kwargs)
except Exception as exc:
response = self.handle_exception(exc)
self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response
'IT > Django' 카테고리의 다른 글
Django core serialize with FK. (0) | 2024.01.08 |
---|---|
Django에서 Celery가 필요한 이유? (0) | 2024.01.04 |
제대로된 해결 방법 - received a naive datetime while time zone support is active. (0) | 2023.06.22 |
How to create Djoser custom token strategy more detail info(jwt 정보추가) (0) | 2023.06.01 |
python script에서 django model 얻는법 (0) | 2023.05.23 |