■ 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에서 필요한 주요 기능들을 하나하나 정리해가면서 조금씩 익숙해져가고 있다.
- 로직을 생각하면서 코드를 하나씩 짜고있지만, 중간중간 익숙치 않은 코드들이 있거나, 임포트 할 때 어떤 클래스에서 모듈을 임포트할지 생각이 안나는 경우가 간혹 있었다.
- 자주 보면 좋겠지만, 그래도 기억이 안날 때를 대비하여 꼭 기억해야 하는 포인트를 생각해야 겠다.
- 특히 안다고 생각해도 같은 기능을 다른 방식으로 여러 번 반복해보는 것도 중요하다고 생각한다.
- 꾸준함!을 유지하자.
'DEV > Web 개발' 카테고리의 다른 글
Web 개발 :: 파이썬 django 인스타그램 코드 리뷰, 머신러닝 (0) | 2022.10.14 |
---|---|
Web 개발 :: 파이썬 django 인스타그램 코드 리뷰, 머신러닝_TIL#29 (0) | 2022.10.13 |
파이썬 웹 프로그래밍 :: 10월 둘째주 WIL #06 (0) | 2022.10.11 |
Web 개발 :: 파이썬 django 인스타그램 클론 코딩_TIL#26 (2) | 2022.10.06 |
Web 개발 :: 파이썬 django 프로젝트(Project), 앱(App)의 구조 (0) | 2022.10.06 |
댓글