์ ์ธ์ฆ ๋ฐฉ๋ฒ์ ๊ตฌํํ๊ณ IsAuthenticated ๊ถํ์ผ๋ก ๋ทฐ๋ฅผ ํธ์ถํ๊ณ ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋์ง ์์ผ๋ฉด django rest ํ๋ ์์ํฌ์์ ๋ค์์ ๋ฐ์์ํต๋๋ค.
File "XXX/site-packages/rest_framework/views.py", line 206, in check_permissions
self.permission_denied(request)
File "XXX/site-packages/rest_framework/views.py", line 80, in permission_denied
if not self.request.successful_authenticator:
File "XXX/site-packages/rest_framework/request.py", line 362, in __getattr__
return getattr(self._request, attr)
AttributeError: 'WSGIRequest' object has no attribute 'successful_authenticator'
์ฝ๋๋ฅผ ๋ณด๋ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค. " self.request
.successful_authenticator"๋ ์ด๋์ ์์ต๋๊น? ์ ๋ " request
.successful_authenticator"์ฌ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
80ํ ๊ทผ์ฒ์ Views.py.
def permission_denied(self, request):
"""
If request is not permitted, determine what kind of exception to raise.
"""
if not self.request.successful_authenticator:
raise exceptions.NotAuthenticated()
raise exceptions.PermissionDenied()
์ฃ์กํฉ๋๋ค, ์ ์ฝ๋์์ ๊ฐ์ ์ค์๋ฅผ ์ ์ง๋ ์ต๋๋ค!!!
Google์ ํตํด ์ด ๋ฌธ์ ์ ๋๋ฌํ๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด...
์ค๋ฅ์ ์์ธ์ ๋ํ ๋จ์๋ WSGIRequest
successful_authenticator
์์ฑ์ด ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ DRF ์ฝ๋์์์ด ์์ ์์ ์ฐ๋ฆฌ๋ ์ฒ๋ฆฌํด์ผ rest_framework.request.Request
๋ณด๋ค๋ ๋ฒ ์ด WSGIRequest
.
๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก pdb๋ฅผ ํตํด ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ฉด WSGIRequest๊ฐ ์๋ DRF ์์ฒญ์ด ์์์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋ฌธ์ ๋ request.Request
์ @property
๋ฐ์ฝ๋ ์ดํ
๋ ๋ฉ์๋( user
, successful_authenticator
๋ฑ)๊ฐ ๋ง์ง๋ง __getattr__
๋ฉ์๋.
์ด๋ค ์์ฑ์ ์ฝ๋๊ฐ AttributeError
๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ฉด Python์ ๋์ __getattr__
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ถ๊ทน์ ์ผ๋ก attr(์์ฑ๊ณผ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์์ฑ์ ์ฐพ์ผ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ค๋ฅ) ์์ WSGIRequest
๊ฐ์ฒด์์.
์ด๊ฒ์ด 'WSGIRequest' object has no attribute 'successful_authenticator'
๋๋ 'WSGIRequest' object has no attribute 'user'
์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์
๋๋ค(ํ์๋ ๋ฌผ๋ก Django AuthenticationMiddleware๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ง).
์ ๊ฒฝ์ฐ์ AttributeError๋ @successful_authenticator
์์ฑ์ ์ฒ์ ์ก์ธ์คํ ๋ ์ฐจ๋ก๋ก ํธ์ถ๋๋ authentication_classes
... ์ค ํ๋์์ ๋ฐ์ํ์ต๋๋ค. Request ํด๋์ค์ ์์ฑ๊ณผ __getattr__
์ ์กฐํฉ์ ์ค๋ฅ์ ์ค์ ์์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ง์คํนํฉ๋๋ค.
DRF ๋ณด๊ธฐ์ ๋ถ์ ์ ํ authentication_classes
(์ค์๋ก ๋ค๋ฅธ ๋๋จธ์ง API ํ๋ ์์ํฌ์ ๋ํ ๋ ๊ฑฐ์ ์ธ์ฆ ํด๋์ค)๊ฐ ์์ ๋ ์คํํฉ๋๋ค. ์ธ์ ๊ฐ ํ์ด์ฌ์ด ํ์
์ธ์ดํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค :)
์ฐธ๊ณ ๋ก djangorestframework-expiring-authtoken
< 0.1.4
๋ก DRF๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์ ๋ฌธ์ ๋ก ์ธํด ์ด ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค.
https://github.com/JamesRitchie/django-rest-framework-expiring-tokens/issues/11
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Google์ ํตํด ์ด ๋ฌธ์ ์ ๋๋ฌํ๋ ๋ค๋ฅธ ์ฌ๋์ ์ํด...
์ค๋ฅ์ ์์ธ์ ๋ํ ๋จ์๋
WSGIRequest
successful_authenticator
์์ฑ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ DRF ์ฝ๋์์์ด ์์ ์์ ์ฐ๋ฆฌ๋ ์ฒ๋ฆฌํด์ผrest_framework.request.Request
๋ณด๋ค๋ ๋ฒ ์ดWSGIRequest
.๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก pdb๋ฅผ ํตํด ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ฉด WSGIRequest๊ฐ ์๋ DRF ์์ฒญ์ด ์์์ ์๊ฒ ๋ ๊ฒ์ ๋๋ค.
๋ฌธ์ ๋
request.Request
์@property
๋ฐ์ฝ๋ ์ดํ ๋ ๋ฉ์๋(user
,successful_authenticator
๋ฑ)๊ฐ ๋ง์ง๋ง__getattr__
๋ฉ์๋.์ด๋ค ์์ฑ์ ์ฝ๋๊ฐ
AttributeError
๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ฉด Python์ ๋์__getattr__
๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ถ๊ทน์ ์ผ๋ก attr(์์ฑ๊ณผ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์์ฑ์ ์ฐพ์ผ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ค๋ฅ) ์์WSGIRequest
๊ฐ์ฒด์์.์ด๊ฒ์ด
'WSGIRequest' object has no attribute 'successful_authenticator'
๋๋'WSGIRequest' object has no attribute 'user'
์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค(ํ์๋ ๋ฌผ๋ก Django AuthenticationMiddleware๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ง).์ ๊ฒฝ์ฐ์ AttributeError๋
@successful_authenticator
์์ฑ์ ์ฒ์ ์ก์ธ์คํ ๋ ์ฐจ๋ก๋ก ํธ์ถ๋๋authentication_classes
... ์ค ํ๋์์ ๋ฐ์ํ์ต๋๋ค. Request ํด๋์ค์ ์์ฑ๊ณผ__getattr__
์ ์กฐํฉ์ ์ค๋ฅ์ ์ค์ ์์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ง์คํนํฉ๋๋ค.