본문 바로가기
DEV/Web 개발

Web 개발 :: 파이썬 django 인스타그램 코드 리뷰_TIL#28

by 올커 2022. 10. 12.

■ JITHub 개발일지 28일차

□  TIL(Today I Learned) ::

Django Instagram _ User account sign-in, sign-up, logout

1. 인스타그램 클론코딩 코드 리뷰 (USER 관리 기능)

 1) prj폴더/settings.py

  - INSTALLED_APPS에 항상 App 이름 추가!

  - 템플릿 폴더를 각 App에 위치하지 않고 메인 디렉토리에 위치시킬 경우

    settings.py의 TEMPLATES 항목 내에 'DIRS': [BASE_DIR / 'templates'] 를 입력한다.

  - 유저모델을 지정하기 위해 AUTH_USER_MODEL = 'user.UserModel' 를 추가한다.

 

 2) prj폴더/urls.py

  - urlpatterns에 각 APP에서 관리하는 urls.py로 연결시켜주기 위해 아래와 같이 입력한다.

    이 때 include 모듈은 기존에 불러오지 않고 있기 때문에 import해준다.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('user.urls')),
    path('', include('post.urls')),
]

 

 3) user앱/urls.py

 - user앱에서 사용할 각 뷰에 따라 url을 아래와 같이 지정한다.

   views탭을 먼저 작성하고 urls를 작성해도 되지만, 이미 정의할 기능과 함수 이름을 알고있기 때문에 미리 urls.py를 아래와 같이 구성하였다.

from django.urls import path
from . import views

urlpatterns = [
    path('sign-in/', views.sign_in_view, name = 'sign-in'),
    path('sign-up/', views.sign_up_view, name = 'sign-up'),
    path('logout/', views.logout, name = 'logout')
]

 

 4) user앱/models.py

 - AbstractUser를 임포트하여 아래와 같이 모델을 정의한다.

   사용해야 할 필드들을 생각하여 타입에 맞게 정의하였다.

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings


# Create your models here.
class UserModel(AbstractUser):
    class Meta:
        db_table = "db_user"
        
    username = models.CharField(max_length=15, unique=True, null=True)
    profile_image = models.ImageField(default="default_profile_pic.jpg", upload_to="profile_pics")
    intro = models.CharField(max_length=60, blank=True)
    follow = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name = 'followee')

 

 5) user앱/views.py

 - user앱에서 사용할 각 함수들을 정의한다.

   사용할 모듈들은 아래와 같이 작성하면서 import한다.

from django.shortcuts import render, redirect
from django.contrib import auth     # 사용자 인증 기능        # ★
from django.contrib.auth.decorators import login_required        # ★
from django.contrib.auth.hashers import check_password        # ★

from .models import UserModel

 

 ① sign_up_view

def sign_up_view(request):
    if request.method == "GET":
        user = request.user.is_authenticated        # ★
        if user:
            return redirect('/')
        else:
            return render(request, 'user/account/signup.html')
        
    elif request.method == "POST":
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        password2 = request.POST.get('password2', '')
        email = request.POST.get('email', '')
        
        if password != password2:
            return render(request, 'user/account/signup.html', {'error':"비밀번호가 같지 않습니다."})
        else:
            if username == '' or password == '' or email == '':
                return render(request, 'user/account/signup.html', {'error':"공백은 입력불가합니다."})
            exist_email = UserModel.objects.filter(email=email)         # ★
            if exist_email:
                return render(request, 'user/account/signup.html', {'error':"존재하는 이메일입니다."})
            else:
                UserModel.objects.create_user(email=email, password=password, username=username)        # ★
                return redirect('/sign-in')

 ② sign_in_view

def sign_in_view(request):
    if request.method == 'GET':
        user = request.user.is_authenticated
        if user:
            return redirect('/')
        else:
            return render(request, 'user/account/signin.html')
    elif request.method == 'POST':
        email = request.POST.get('email', '')
        username = UserModel.objects.get(email=email)         # ★
        password = request.POST.get('password', '')
        me = auth.authenticate(request, email=email, username=username, password=password)         # ★
        if me is not None:
            auth.login(request, me)         # ★
            return redirect('/')
        else:
            return render(request, 'user/account/signin.html', {'error':'입력값을 다시 확인해주세요'})

 ③ logout

@login_required
def logout(request):
    auth.logout(request)
    return redirect('/')

 ④ account_delete

def account_delete(request):
    if request.method == "POST":        # ★
        pw_del = request.POST.get('pw_del','')
        user = request.user
        if check_password(pw_del, user.password):
            user.delete()
            return redirect('/')
    return render(request, 'user/account/account_delete.html')

 

 ⑤ 화면에 띄워줄 templates 정리, View에서 GET, POST 연결되는 항목들 확인

 


□  TIF(Today I Felt) ::

  - Django에서 필요한 주요 기능들을 하나하나 정리해가면서 조금씩 익숙해져가고 있다.

  - 로직을 생각하면서 코드를 하나씩 짜고있지만, 중간중간 익숙치 않은 코드들이 있거나, 임포트 할 때 어떤 클래스에서 모듈을 임포트할지 생각이 안나는 경우가 간혹 있었다.

  - 자주 보면 좋겠지만, 그래도 기억이 안날 때를 대비하여 꼭 기억해야 하는 포인트를 생각해야 겠다.

  - 특히 안다고 생각해도 같은 기능을 다른 방식으로 여러 번 반복해보는 것도 중요하다고 생각한다.

  - 꾸준함!을 유지하자.

 

 

반응형

댓글