이전글 : [파이썬] Django - 기초 실습 1) User
로그인 이후 Tweet 화면 이동
1. tweet/urls.py에서 url에 따라 실행하는 함수 설정
# tweet/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'), # 127.0.0.1:8000 과 views.py 폴더의 home 함수 연결
path('tweet/', views.tweet, name='tweet') # 127.0.0.1:8000/tweet 과 views.py 폴더의 tweet 함수 연결
]
2. tweet/views.py에서 로그인 상태 검사 후 페이지 이동하는 home 메서드 작성
- 검사 결과 True이면 /tweet 으로 redirect 후 tweet 함수 실행 (render)
def home(request):
user = request.user.is_authenticated # is_authenticated : 로그인 되어 있는지 검사
if user:
return redirect('/tweet')
else:
return redirect('/sign-in')
def tweet(request):
if request.method == 'GET':
return render(request, 'tweet/home.html')
3. project/urls.py에서 tweet/urls 등록
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('user.urls')),
path('', include('tweet.urls')),
]
4. user/views.py에서 로그인 시 접속한 사용자 이름 출력하는 부분을 redirect로 변경
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
# 인증 기능 모듈을 먼저 불러온다
# authenticate : 암호화된 비밀번호와 현재 입력된 비밀번호와 일치하는지 그게 사용자와 맞는지까지 확인
me = auth.authenticate(request, username=username, password=password)
if me is not None:
auth.login(request, me) # 세션과 같은 로그인과 관련된 처리들을 django가 해준다
return redirect('/') # tweet/views.py의 home 실행
else:
return redirect('/sign-in')
elif request.method == 'GET':
return render(request, 'user/signin.html')
Templates
1. templates/base.html(네비게이션 영역)에서 조건에 따라 출력
...
<form class="form-inline my-2 my-lg-0">
{% if not user.is_authenticated %}
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="/sign-in"> Sign In <span class="sr-only"></span></a>
</li>
<li class="nav-item active">
<a class="nav-link" href="/sign-up"> Sign Up <span class="sr-only"></span></a>
</li>
</ul>
{% else %}
{{ user.username }} 님 반갑습니다!
{% endif %}
</form>
...
2. templates/tweet/home.html에서 로그인 된 사용자 정보 출력
...
<!-- 왼쪽 컬럼 -->
<div class="col-md-3">
<div class="card">
<div class="card-body">
<h5 class="card-title"> {{ user.username }} </h5>
<p class="card-text"> {{ user.bio }} </p>
</div>
</div>
</div>
...
URL 접근 권한
[로그인 하지 않은 사용자가 home 페이지로 접속한 경우]
1. tweet/views.py의 해당 메서드에서 로그인 상태 검사
def tweet(request):
if request.method == 'GET':
user = request.user.is_authenticated # is_authenticated : 로그인 되어 있는지 검사
if user:
return render(request, 'tweet/home.html') # 로그인 한 사용자라면 home.html 이동
else:
return redirect('/sign-in') # 로그인 하지 않은 사용자라면 로그인 페이지로 이동
[로그인 한 사용자가 로그인/회원가입 페이지로 접속한 경우]
2. user/views.py의 해당 메서드에서 로그인 상태 검사
def sign_up_view(request):
if request.method == 'GET':
user = request.user.is_authenticated # is_authenticated : 로그인 되어 있는지 검사
if user:
return redirect('/') # 로그인 한 사용자라면 home.html 이동
else:
return render(request, 'user/signup.html') # 로그인 하지 않은 사용자라면 회원가입 페이지로 이동
elif request.method == 'POST':
username = request.POST.get('username', None) # POST 받은 username 저장 없다면 None
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio', None)
if password != password2:
return render(request, 'user/signup.html')
else:
# get_user_model() : 사용자 데이터의 DB 내 존재유무 검사
exist_user = get_user_model().objects.filter(username=username)
if exist_user:
return render(request, 'user/signup.html')
else:
# django의 auth_user에 존재하는 create_user 사용
UserModel.objects.create_user(username=username, password=password, bio=bio)
return redirect('/sign-in')
def sign_in_view(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
# 인증 기능 모듈을 먼저 불러온다
# authenticate : 암호화된 비밀번호와 현재 입력된 비밀번호와 일치하는지 그게 사용자와 맞는지까지 확인
me = auth.authenticate(request, username=username, password=password)
if me is not None:
auth.login(request, me) # 세션과 같은 로그인과 관련된 처리들을 django가 해준다
return redirect('/') # tweet/views.py의 home 실행
else:
return redirect('/sign-in')
elif request.method == 'GET':
user = request.user.is_authenticated # is_authenticated : 로그인 되어 있는지 검사
if user:
return redirect('/') # 로그인 한 사용자라면 home.html 이동
else:
return render(request, 'user/signin.html') # 로그인 하지 않은 사용자라면 로그인 페이지로 이동
로그아웃
1. user/urls.py에서 logout url 등록
from django.urls import path
from . import views
urlpatterns = [
path('sign-up/', views.sign_up_view, name='sign-up'),
path('sign-in/', views.sign_in_view, name='sign-in'),
path('logout/', views.logout, name='logout'),
]
2. user/views.py에서 logout 함수 작성
from django.contrib.auth.decorators import login_required
# @login_required : 사용자가 로그인이 되어 있어야만 접근 할 수 있는 함수라고 정의
@login_required
def logout(request):
auth.logout(request)
return redirect('/')
3. templates/base.html(네비게이션 영역)에서 로그아웃 링크 추가
<form class="form-inline my-2 my-lg-0">
{% if not user.is_authenticated %}
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="/sign-in"> Sign In <span class="sr-only"></span></a>
</li>
<li class="nav-item active">
<a class="nav-link" href="/sign-up"> Sign Up <span class="sr-only"></span></a>
</li>
</ul>
{% else %}
<ul class="navbar-nav mr-auto">
<li class="nav-item disabled">
<span class="nav-link">
{{ user.username }} 님 반갑습니다!
</span>
</li>
<li class="nav-item active">
<a class="nav-link" href="/logout"> Logout </a>
</li>
</ul>
{% endif %}
</form>
'Backend > Django' 카테고리의 다른 글
[파이썬] Django - SNS 기초 실습 6) 회원가입/로그인/친구 서비스 디테일 (0) | 2022.05.30 |
---|---|
[파이썬] Django - SNS 기초 실습 5) Follow (ManyToMany) (0) | 2022.05.30 |
[파이썬] Django - SNS 기초 실습 4) Tweet (조회, 댓글) (0) | 2022.05.27 |
[파이썬] Django - SNS 기초 실습 3) Tweet (게시글) (0) | 2022.05.27 |
[파이썬] Django - SNS 기초 실습 1) User (0) | 2022.05.27 |