A ship in harbor is safe, but that is not what ships are built for.

개발일지/AI 캠프

내일배움캠프 AI - 23일차 TIL, 2022.09.30

플리피나리 2022. 10. 2. 02:45
반응형

스파르타 코딩클럽 내일배움캠프 AI 웹개발자양성과정 3회차

2022.09.30. 23일차 - TIL

 

 

1. Django 원격 강의

  • 로그인 이후 기능 다듬기
    - django 템플릿 : 파이썬을 html로 바꿔주어, 빠르고 쉽게 동적인 웹 사이트를 만들게 도움
    - 왼쪽 card에 사용자의 정보를 보여주기 위해 tweet 폴더의 home.html 변경
<!-- templates/tweet/home.html -->
<!-- 왼쪽 컬럼 -->
<div class="col-md-3">
    <div class="card">
        <div class="card-body">
            <!--<h5 class="card-title">Card title</h5>
            <p class="card-text">Some quick example text to build on the card title and make up the bulk of
                the card's content.</p> -->
                <h5 class="card-title">{{ user.username }}</h5> <!-- 사용자의 이름 -->
                <p class="catd-text">{{ user.bio }}</p> <!-- 사용자의 상태메시지 -->
        </div>
    </div>
</div>

        - 상단 부분의 Sign In, Sign Up을 변경하기 위해 base.html 변경

<!-- templates/base.html -->

		... 생략 
				<li class="nav-item">
            <a class="nav-link" href="#"> 친구 <span class="sr-only"></span></a>
        </li>
    </ul>
</div>
<form class="form-inline my-2 my-lg-0">
    {% if not user.is_authenticated %}  <!-- user가 로그인 되어 있지 않을 때 Sign In, Sign Up을 보여줌 -->
    <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을 보여줌 -->
    	{{ user.username }} 님 반갑습니다!
    {% endif%}
</form>

... 생략
  • 로그인 필요 기능과 로그아웃 만들기
    - 로그인 한 사람만 해당 tweet 페이지에 접근 가능하도록 만들기
    - tweet 함수에 로그인한 사용자를 판단하는 기능 추가
    - request.user.is_authenticated : 지금 요청을 보낸 사용자가 로그인 되어 있는 사용자가 맞는지 확인하는 함수
# tweet/views.py
from django.shortcuts import render, redirect

def tweet(request):
    if request.method == 'GET'  # 요청하는 방식이 GET 방식인지 확인하기
        user = request.user.is_authenticated  # 사용자가 로그인이 되어 있는지 확인하기
        if user:  # 로그인 한 사용자라면 
        	return render(request, 'tweet/home.html')  # tweet의 home.html 렌더링
        else:  # 로그인 되어 있지 않다면
        	return redirect('/sign-in')  # 로그인 페이지로 이동

       - 로그인 한 사람은 로그인, 회원가입 페이지로 들어가지 않고, 기본 페이지('/')로 되돌아 가도록 작업
       - 회원가입 페이지와 연결되는 함수 sign_up_view와 로그인 페이지와 연결되는 함수 sign_in_view 수정

# user/views.py

def sign_up_view(request):
    if request.method == 'GET':
        user = request.user.is_authenticated  # 로그인 된 사용자가 요청하는지 검사
        if user:  # 로그인이 되어있다면
            return redirect('/')  # url이 /인 home.html로 이동
        else:  # 로그인이 되어있지 않다면
            return render(request, 'user/signup.html')  # 회원가입 페이지로 이동
    elif request.method == 'POST':
        username = request.POST.get('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:
            exist_user = get_user_model().objects.filter(username=username)
            if exist_user:
                return render(request, 'user/signup.html') # 사용자가 존재하기 때문에 사용자를 저장하지 않고 회원가입 페이지를 다시 띄움
            else:
                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)

        me = auth.authenticate(request, username=username, password=password)  # 사용자 불러오기
        if me is not None:  # 저장된 사용자의 패스워드와 입력받은 패스워드 비교
            auth.login(request, me)
            return redirect('/')
        else:
            return redirect('/sign-in')  # 로그인 실패
      elif request.method == 'GET':
          user = request.user.is_authenticated  # 사용자가 로그인 되어 있는지 검사
          if user:  # 로그인이 되어있다면
              return redirect('/')
          else:  # 로그인이 되어 있지 않다면
              return render(request, 'user/signin.html')

     - 로그아웃 기능 구현

# user/views.py에 다음 코드 추가

from django.contrib.auth.decorators import login_required

# 로그인 한 사용자만 접근할 수 있게 해주는 기능 -> 로그인을 하지 않을 경우 접근 불가
# request.user.is_authenticated는 로그인의 여부만 검증
@login_required
def logout(request):
    auth.logout(request)  # 인증 되어있는 정보를 없애기
    return redirect("/")
# user/urls.py

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')  # 로그아웃 url 추가
]
<!-- templates/base.html -->

		... 생략 
				<li class="nav-item">
            <a class="nav-link" href="#"> 친구 <span class="sr-only"></span></a>
        </li>
    </ul>
</div>
<form class="form-inline my-2 my-lg-0">
    {% if not user.is_authenticated %}  <!-- user가 로그인 되어 있지 않을 때 Sign In, Sign Up을 보여줌 -->
    <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가 로그인 되어있을때 -->
    <ul class="navbar-nav mr-auto">
        <li class="nav-item" disabled>
            <span class="nav-link">
                {{ user.username }} 님 반갑습니다!  <!-- username을 보여줌 -->
            </span>
        </li>
        <li class="navbar-nav mr-auto">
            <li class="nav-item">
                <a class="nav-link" href="/logout">로그아웃</a>  <!-- 로그아웃을 보여줌 -->
            </li>
        </li>
    {% endif%}
</form>

... 생략
반응형