Dev./Error.
[Error] TypeError: change_view() missing 1 required positional argument: 'object_id'
devz0
2023. 3. 16. 12:57
728x90
TypeError: change_view() missing 1 required positional argument: 'object_id'
Simplt JWT를 사용해서 미들웨어단에서 처리되도록 로그인 로직을 작성했다. 잘 돌아가는 것을 확인 한 후 다음 이슈를 해결하기위해 어드민 페이지에 접속해 아무 데이터나 클릭한 순간 발생한 에러이다.
GET /admin/users/user/1/change/
해당 url을 보면 어드민 유저페이지의 1번 유저를 수정할 때 발생했다. 유저아이디 1번의 파라미터 값을 읽지 못한것이다.
에러내용을 쭉 보면 내가 작성했던 미들웨어 훅(process_view)에서 발생 하는 것을 알 수 있었다.
Middleware Hook
클래스 형식으로 미들웨어를 정의할 때 HTTP request/response 처리 메소드를 추가로 정의 해주는 것
process_view(request, view_func, view_args, view_kwargs)
- request - HttpRequest object
- view_func - django가 사용할 view function . str이 아닌 실제 함수 객체
- view_args - view에서 넘어오는 positional arguments
- view_kwargs - view에서 넘어오는 dictionary of keyword arguments
- view_args, view_kwargs 둘다 첫 번째 인수(request)를 포함하지 않는다
- process_view() 는 Django가 view를 호출하기 직전에 trigger
- 무조건 None아니면 HttpResponse object를 return
- return None - Django는 해당request 를 그대로 진행, 다른 process_view() middleware와 적절한 view 를 호출
- return HttpResponse - Django는 다른 request, view, excpetion middleware, 적절한 view 를 호출하려 하지 않고 HttpResponse를 호출
해결 과정
Django 클래스 뷰에서는 kwargs를 통해 url 매개변수를 받을 수 있다.
process_view 함수 최상단에 view_kwargs를 확인해보니
{'object_id': '1'}
딕셔너리 형태의 키워드로 잘 출력이 되었다. 내 실수는
- view_args, view_kwargs 둘다 첫 번째 인수(request)를 포함하지 않는다
조건을 생각 하지 않고 로직을 작성한 것이다. 함수객체에 request를 담아 넘겨줄 때 인수들을 넣어주지 않았다.
넘겨줄 때는 1개 이상 일 수 있기 때문에 키워드를 패킹해서 담아주어야 한다.
response = view_func(request, *args, **kwargs)
다음과 같이 request만 담아보낸 로직을 변경하면 내가 생각했던 대로 1번 유저의 수정 페이지로 잘 넘어간다!
728x90
반응형