PROJECT/MYPJ

RE_PROJECT 01 | 회원가입, 로그인, 로그아웃 구현하기

JUNG씨 2022. 10. 11. 20:19

👩🏻‍💻프로젝트 기간 동안에는 모든 코드를 하나하나 이해할수가 없었어서 내가 제대로 뭘 한건지 기억이 나지 않는다....

그래서 앞으로 틈이 나는대로, 아니 9시 이후에 조금씩이라도 처음부터 인스타그램 클론코딩을 내 힘으로 처음부터 다시 도전해보려고 한다!~ 일단 거북이반 장고 강의를 들으면서 기본내용을 다시 복습해보고 10월 10일 월요일부터 시작했다!

 

➡️ 현재 메인폴더인 instagram / templates 폴더 / tweet 앱 / user 앱 까지 만들었다. 

 

 


✅ 회원가입 / 로그인 / 로그아웃 기능 만들기 ✅

 

✔️ instagram/settings.py 수정

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    'user',
    'tweet',
]


# templates 경로 설정
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

➡️ 어플리케이션에 내가 만든 user, tweet앱을 등록해주고, templates폴더를 메인 폴더와 같은 위치에 만들었기 때문에 templates의 베이스 디렉토리를 설정해 주어야 한다. 

https://hyunjoo3107.tistory.com/73

 

Django Error | TemplateDoesNotExist at /

templates 폴더에 html 파일을 만들어서 작성을 하고 runserver를 했는데 저 에러가 자꾸 나면서 연결이 안됐다. settings.py에서 templates의 루트 디렉토리를 설정해줘야 했었다. 저거 설정하니까 바로 아

hyunjoo3107.tistory.com

 

 

✔️ instagram/urls.py 에 추가

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

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

 

 

 

✔️ user/models.py 작성

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

# Create your models here.
class UserModel(AbstractUser):
    
    class Meta:
        db_table = "user"
        
    bio = models.TextField(max_length=256, default='')

➡️ 장고에서 제공하는 기본 모델에 bio라는 필드만 추가해서 db를 만들었다. 

 

 

 

 

✔️ user/urls.py 에 추가

from django.urls import path
from . import views
from django.conf import settings


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을 설정해주었으니 이제 views.py에서 회원가입,로그인,로그아웃 함수의 로직을 작성해볼 것이다.

 

 

 

 

✔️user/views.py/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/signup.html')
            
    elif request.method == "POST":
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        password2 = request.POST.get('password2', '')
        first_name = request.POST.get('first_name', '')
        bio = request.POST.get('bio', None)
        
        if password != password2:
            return render(request, 'user/signup.html', {'error: 패스워드가 일치하지 않습니다!'})
        else:
            if username == '' or password == '' or first_name == '' :
                return render(request, 'user/signup.html',{'error':'빈칸을 모두 채워주세요!'})
            
            exist_user = get_user_model().objects.filter(username=username)
            if exist_user:
                # 사용자가 존재하기 때문에 사용자를 저장하지 않고 회원가입 페이지를 다시 띄움
                return render(request, 'user/signup.html', {'error': '사용자가 이미 존재합니다!'}) 
            else:
                UserModel.objects.create_user(username=username, password=password, first_name=first_name)
                return redirect('/sign-in')

✔️ user/views.py/sign_in_view() #로그인

def sign_in_view(request):
    if request.method == "POST":
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        
        me = auth.authenticate(request, username=username, password=password)
        
        # 저장된 사용자의 패스워드와 입력받은 패스워드 비교
        if me is not None:
            auth.login(request, me)
            return redirect('/tweet')
        else:
            return render(request, 'user/signin.html', {'error':'유저이름 혹은 패스워드를 확인해주세요! '})
        
    elif request.method == "GET":
        # 로그인된 사용자가 요청하는 것인지 검사
        user = request.user.is_authenticated
        
        if user: 
            return redirect('/tweet')
        else: #로그인이 되어있지 않으면
            return render(request, 'user/signin.html')

✔️ user/views.py/logout()  #로그아웃

# 로그아웃하려면 무조건 로그인 되어있어야하니까 login_required
@login_required
def logout(request):
    auth.logout(request) # 인증 되어있는 정보를 없애기
    return redirect("/")

✔️ templates/base.html 에서 수정 #로그아웃 아이콘에 링크 연결하기

<li class="nav-item active">
	<a class="nav-link" href="/logout"><i class="bi-box-arrow-right"></i></a>
</li>

 

 

➡️ 여기까지는 일단 순조롭지만... 이제 본격적으로 시작!