1. 배경
장고에서는 다양한 방법으로 로그인한 유저만 허용하도록 할 수 있습니다. 예를 들어, 커뮤니티 웹사이트에서 글 목록까진 볼 수 있지만, 글을 보려면 로그인해야 볼 수 있게 할 수 있습니다. 이는 장고의 View단에서 구현됩니다. 유저가 로그인했는지를 판단하는 3가지 방법을 알아보겠습니다.
2. 방법
1) request.user로 판단
def index(request: HttpRequest) -> HttpResponse:
if not request.user.is_authenticated:
return redirect("/accounts/login/")
qs = Post.objects.all()
return render(request, "blog/index.html", context={"post_list": qs})
* 코드 설명
index함수는 view의 함수로 request를 input으로 받습니다. user가 로그인된 경우, request.user.is_authenticated는 True를 반환합니다. 이를 이용해서 조건문으로 로그인되지 않은 경우 login 화면으로 리다이렉트 하는 코드입니다.
2) @login_required로 판단
데코레이터 문법을 활용한 방법입니다. 데코레이터를 활용한 방법을 AOP(Aspect Oriented Programming:관점 지향 프로그래밍)이라고 합니다. AOP는 쉽게말해, 보기 좋게 프로그래밍하는 것입니다. 데코레이터로 함수/클래스를 감싸는 형태로 필요한 기능을 수행하기 때문입니다.
@login_required
def post_detail(request: HttpRequest, pk: int) -> HttpResponse:
# post = Post.objects.get(pk=pk)
post = get_object_or_404(Post, pk=pk) # 해당 오브젝트가 없으면 404페이지로 보낸다.
return render(request, "blog/post_detail.html", {"post": post})
* 코드 설명
데코레이터를 이용한 방법입니다. View에서 사용하고자 하는 함수위에 @login_required를 작성해주면 그 바로 아래의 함수에 대해 wrapper(래퍼) 역할을 하여 로그인된 경우만 아래 함수가 실행될 수 있도록 하고, 로그인하지 않은 상태로 아래 함수를 호출하게 되면 해당 유저는 로그인 화면으로 가게 됩니다. (클래스형 뷰에는 이를 쓸 수 없습니다.)
3) login_required() 함수 사용
post_new = login_required(
CreateView.as_view(
model=Post,
form_class=PostForm,
success_url="/blog/",
)
)
* 코드 설명
CreateView.as_view()라는 CBV(Class Based View)를 사용하는 경우는 함수/클래스를 정의하는 게 아니고, 정의된 클래스를 import 하여 사용하기 때문에 데코레이터를 사용하기 어렵습니다. 그럴 땐, login_required() 함수 내부에 CreateView.as_view() 함수를 작성하면, 해당 뷰 함수는 로그인된 경우만 호출됩니다.
Reference
1. django Logo: https://codecondo.com/jobs-for-django-developers/django-framework-logo/
2. Content: 인프런 장고 강의 https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-%EC%84%A4%EA%B3%84%EC%B2%A0%ED%95%99-%EC%9E%85%EB%AC%B8/
'Back-End > Django' 카테고리의 다른 글
[Django] 간단하게 알아보는 N+1 문제 해결! (select_related, prefetch_related) (0) | 2022.08.11 |
---|---|
[Django] SQL 쿼리 로그 확인하기 (feat. 콘솔창) (0) | 2022.08.11 |
[Django] 로그인, 로그아웃 간단 구현! (CBV) (0) | 2022.08.10 |
[Django] django command로 메일 보내기2 (HTML Template 활용) (0) | 2022.08.09 |
[Django] django command로 메일 보내기 기초 사용법(feat. naver mail) (0) | 2022.08.09 |