4번째 줄: |
4번째 줄: |
| 몇시간을 고민하고 시도하다 만족스런 답을 찾았다. | | 몇시간을 고민하고 시도하다 만족스런 답을 찾았다. |
| | | |
− | # 뷰 : 최약의 선택. 모든 뷰에서 기존화면을 저장하게 할 수는 없다. | + | # 뷰 : 최악의 선택. 모든 뷰에서 기존화면을 저장하게 할 수는 없다. |
| + | # 데코레이터 상속 : login_requeired 데코레이터를 변형해서 진행해보려 했는데... 나는 모달로 바로 소셜로그인페이지로 넘어가게끔 만들어둬서 데코레이터를 거치지 않는 경우가 발생했다.(단순 로그인 버튼을 쓴다면 좋은 전략일듯. 버튼으로 작동하는 뷰 하나만 고쳐 데코레이터를 달면 되니까. + 일반 데코레이터가 달린 뷰에서도 자연스레 작동할 테니까.) 다만, 외부링크로 로그인이 필요한 페이지를 보낼 때 사용하면 좋은 전략일 듯하다. |
| # 미들웨어 : 단일 로그인이라면 괜찮지만... 소셜로그인이라든가 외부 기능을 사용하게 되면 이전 페이지를 저장할 때 외부 페이지가 저장되어버린다. | | # 미들웨어 : 단일 로그인이라면 괜찮지만... 소셜로그인이라든가 외부 기능을 사용하게 되면 이전 페이지를 저장할 때 외부 페이지가 저장되어버린다. |
| # 탬플릿 필터 이용 : 그나마 이게 범용적으로 사용 가능할듯. | | # 탬플릿 필터 이용 : 그나마 이게 범용적으로 사용 가능할듯. |
| | | |
− | === 과정 === | + | == 데코레이터 조작 == |
| + | {| class="wikitable" |
| + | !과정 |
| + | !설명 |
| + | !비고 |
| + | |- |
| + | |데코레이터 .py 작성. |
| + | |적절히 관리할 곳에 작성. |
| + | |<syntaxhighlight lang="python"> |
| + | from django.shortcuts import redirect |
| + | from functools import wraps |
| + | |
| + | def custom_login_required(): |
| + | '''로그인 데코레이터의 기능에 현재 페이지를 저장하기 위해.''' |
| + | def _decorator(view_func): |
| + | @wraps(view_func) |
| + | def _wrapped_view(request, *args, **kwargs): |
| + | # 로그인 하지 않았을 때에만. |
| + | if not request.user.is_authenticated: |
| + | request.session['before_login'] = request.path |
| + | return redirect('custom_account:login_social') # 로그인 페이지로 이동. |
| + | return view_func(request, *args, **kwargs) |
| + | |
| + | return _wrapped_view |
| + | |
| + | return _decorator |
| + | </syntaxhighlight> |
| + | |- |
| + | |데코레이터 사용 |
| + | |기존에 사용하던 login_required를 일일이 바꿔주긴 쉽지 않아 다음과 같이 처리한다. |
| + | |from custom_account.decorator import custom_login_required as login_required |
| + | |- |
| + | |뷰에서 리다이렉트 |
| + | |다른 것과 동일. |
| + | |세션에서 befroe_login 을 불러와 리다이렉트. |
| + | |} |
| + | |
| + | == 탬플릿 필터 이용 == |
| {| class="wikitable" | | {| class="wikitable" |
| |+ | | |+ |