어제부터 인스타그램 클론 프로젝트에 들어갔다
나는 회원가입, 로그인 프론트와 백엔드를 담당했다
프론트는 여러 사이트를 참고하며 만들었고
백엔드는 수업자료를 바탕으로 고안해 봤다
어제까지는 유저 확장을 안 했다가 오늘은 장고 user 테이블로 확장해 보았다
email, fullname(성명), username(id), password 4개를 먼저 입력 받아서 DB에 저장했다
#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 = "my_user" # 여기는 테이블 이름이에요! 꼭 기억 해 주세요!
fullname = models.CharField(max_length=20, null=False )
인스타그램의 경우 이메일 혹은 전화번호로 로그인 가능한데 두 개를 동시에 어떻게 받아야 할지 모르겠어서 username으로만 받기로 했다
from django.shortcuts import render, redirect
from .models import UserModel
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import get_user_model #사용자가 있는지 검사하는 함수
from django.contrib.auth import authenticate,login
from django.contrib.auth.decorators import login_required
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':
email = request.POST.get('email', None)
username = request.POST.get('username', None)
fullname = request.POST.get('fullname', None)
password = request.POST.get('password', None)
exist_user = get_user_model().objects.filter(username=username)
if exist_user:
return render(request,'user/signup.html')
else:
UserModel.objects.create_user(email=email, fullname=fullname, username=username, password=password,)
return redirect('/sign-in') # 회원
@csrf_exempt
def sign_in_view(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
me = authenticate(username=username, password=password) # 사용자 불러오기
if me is not None: # 저장된 사용자의 패스워드와 입력받은 패스워드 비교
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')
@login_required
def logout(request):
auth.logout(request)
return redirect("/")
로그인, 회원가입까지 다 하고 로그아웃하려던 참에 팀 중간 미팅 시간이 다 되어서 추가 기능은 구현하지 못했다.
같은 팀원분 중 한 분도 나와 같은 파트를 담당했는데 내가 구현하지 못했던 이메일과 전화번호 동시에 받아서 로그인하는 방법을 알고 계셨다. 덕분에 몰랐던 부분을 새로 채울 수 있었다.
def sign_in_view(request):
if request.method == "GET":
user = request.user.is_authenticated
if user:
return render(request, 'tweet/home.html')
else:
return render(request, 'user/signin.html')
elif request.method == "POST":
is_email = re.compile(r"^[a-zA-Z]+[!#$%&'*+-/=?^_`(){|}~]*[a-zA-Z0-9]*@[\w]+\.[a-zA-Z0-9-]+[.]*[a-zA-Z0-9]+$")
is_phone_num = re.compile(r'^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})')
user_id 하나에 전화번호랑 이메일을 다 받았다고 하셨다
로그인 - 회원가입 -로그인 창까지 다시 오는 건 성공했는데
로그인 성공하면 나오는 페이지나 로그인 실패했을 때 나타나는 에러 표시가 뜨지 않는다
다시 수정해야 할 거 같다