RE_PROJECT 01 | 회원가입, 로그인, 로그아웃 구현하기
👩🏻💻프로젝트 기간 동안에는 모든 코드를 하나하나 이해할수가 없었어서 내가 제대로 뭘 한건지 기억이 나지 않는다....
그래서 앞으로 틈이 나는대로, 아니 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>
➡️ 여기까지는 일단 순조롭지만... 이제 본격적으로 시작!