#27 Authentication ์ธ์ฆ์์คํ ๊ตฌ์ถ
authentication
์ฐ๋ฆฌ๊ฐ account๋ฅผ ๋ง๋ ์ด์ ?
: ์๋ฌด๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์คํํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๋๊ฐ ๋๊ตฐ์ง ํ์ธ ํ์.
view ์์
views์์ request.user.is_authenticated ๋ก ๋ก๊ทธ์ธ๋์ด์๋์ง ์๋์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ๋์ ํ๋๋ก ์์
๋ก๊ทธ์ธ ์๋์ด์๋ ๊ฒฝ์ฐ, ์์ฒ๋ผ ๋ก๊ทธ์ธ์ฐฝ์ผ๋ก redirect ๋จ
class์์ ํจ์๋ฅผ ์ ์ธํด์ get ๋ด๋ถ ํ๋์ ์ง์ ํด์ค ์ ์์.
def get(self, *args, **kwargs):
if self.request.user.is_authenticated:
return super().get(*args,**kwargs)
else:
return HttpResponseRedirect(reverse('accountapp:login'))
์์ฒ๋ผ~~
์ด๋ ๊ฒ๋ง ํ์๋์ ๋ฌธ์ ๋ test1 ์ผ๋ก ๋ก๊ทธ์ธํ๊ณ ๋ค๋ฅธ ์ฌ๋ ๊ณ์ ์ ์ ๋ณด ์์ ํ์ด์ง์ ์ ๊ทผ ๊ฐ๋ฅํจ..ํํด๊น์ง๋ ๊ฐ๋ฅ
⇒ pk์ ํด๋นํ๋ object ์ฆ, user๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์์ request๋ฅผ ๋ณด๋ด๊ณ ์๋ ์ ์ ์ ๊ฐ์์ง ํ์ธ!
#28 Decorator๋ฅผ ์ด์ฉํ ์ฝ๋ ๊ฐ์ํ
27๊ฐ์์ ์์ฑํ๋ ์ฝ๋๋ฅผ ๊ฐ์ํ์ํค๊ธฐ
Decorator
ํ์ด์ฌ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ,
ํจ์๋ฅผ ์ ๋ค๋ก ๊พธ๋ฉฐ์ค ์๋ ์๊ณ … ํจ์๋ฅผ ๊พธ๋ฉฐ์ฃผ๋ ํํ ํจ์์ ๋ด๋ถ๋ฅผ ๊ณ ์น์ง๋ ์์ง๋ง ์๋ค์ ๋ถ์ด์~.. ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ์ํ๋จ !
๊ฒน์น๋ ๋ด์ฉ๋ค์ ํ๋๋ก ๋นผ๊ณ ๊ทธ๊ฑธ decorator๋ก ๊ฐ์ธ์ ์๋ค๋ก ์์ ํด์ฃผ๊ธฐ
def hello_world ์์
@login_required
์ ์ฒ๋ผ ๋ถ๋ฌ์ค๋ฉด ๋จ!
if user.is_authenticated ํ๋๊ฑฐ ์๋์ผ๋ก ํด์ค
class AccountUpdateView ์์
class์ ์ ์ฉํ ๋๋ ๋ ์กฐ๊ธ ๋ค๋ฅด๋ค.
class ์์ ์๋ method์๋
@method_decorator
์๋ฅผ ๊ฐ์ ธ์์ ์ด ์์ ๋ฃ์ด์ค
: ์ผ๋ฐ function์ ์ฌ์ฉํ๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ method์์๋ ์ฌ์ฉํ ์ ์๋๋ก ๋ณํํด์ฃผ๋ ๋ฐ์ฝ๋ ์ดํฐ
@method_decorator(login_required,'get')
@method_decorator(login_required, 'post')
์ด๋ฐ์์ผ๋ก~~
login_required๋ ๋ก๊ทธ์ธํ๋์ง๋ง ํ์ธํด์ฃผ๋ ๋ฐ์ฝ๋ ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ ๋ณธ์ธ์ธ์ง ํ์ธํ๊ธฐ ์ํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋ค์ด์ฃผ์ด์ผํจ!
custom decorator
accountapp ๋ด์ decorator ํ์ด์ฌ ํ์ผ ๋ง๋ค์ด์
from django.contrib.auth.models import User
from django.http import HttpResponseForbidden
def account_ownership_required(func):
def decorated(request, *args, **kwargs):
user = User.objects.get(pk=kwargs['pk'])
if not user == request.user:
return HttpResponseForbidden()
return func(request, *args, **kwargs)
return decorated
์์ฒ๋ผ ์์ฑํด์ฃผ๋ฉด ์ง๊ธ ๋ก๊ทธ์ธํ ์ ์ ์ ํด๋น ์ ์ ๊ฐ ๊ฐ์์ง ํ์ธ ๊ฐ๋ฅ ( user ๊ฐ request๋ฅผ ์์ฒญํ ์ ์ ์ ๊ฐ์์ง ํ์ธ )
๋ค์์ ๋ฐ์ฝ๋ ์ดํฐ
์ฌ๋ฌ๊ฐ์ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ๊ฐ๊ฐ์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ชจ๋ ์ ์ด์ค ์๋ ์์ง๋ง,
has_ownership = [account_ownership_required, login_required]
์์ฒ๋ผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์
@method_decorator(has_ownership, 'get')
@method_decorator(has_ownership, 'post')
์ด๋ฐ์์ผ๋ก ์ ์ด์ค ์ ์์. ๊ธฐ์ตํ๊ธฐ
#29 superuser, media ๊ด๋ จ ์ค์
profile ์ฑ์ ๋ง๋ค๊ธฐ ์ ์ ์ฌ์ ์ค์ ํด์ฃผ๋ ์๊ฐ
superuser
python manage.py createsuperuser
๋ก superuser ์์ฑํด์ค
์ด๊ฑธ๋ก adminํ์ด์ง ๋ค์ด๊ฐ๋ฉด ๋ค ๊ฐ๋ฅ
media ์ค์
MEDIA_URL = '/media/'
MEDIA_ROOT=os.path.join(BASE_DIR,'media')
settings.py ์์ ์์ ๊ฐ์ด ๋ฏธ๋์ด ๊ฒฝ๋ก ์ค์ media/ ์ดํ์ ํ์ผ๋ค์ ์ ๊ทผ ๊ฐ๋ฅ
pip install pillow
media ์ด์ฉํ ๋ ํ์ํ๋ฏ๋ก ์ค์น
๋ฐํ์๋์ ์ธํ๋ฐ ๊ฐ์๋ฅผ ์๊ฐํ๋ฉฐ ์ ๋ฆฌํด๋ณด๋ ๊ธ์ ๋๋ค.
https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-%ED%95%80%ED%84%B0%EB%A0%88%EC%8A%A4%ED%8A%B8