프로젝트 1

·2022년 9월 30일
0

TIL

목록 보기
19/46
post-thumbnail

어제부터 인스타그램 클론 프로젝트에 들어갔다
나는 회원가입, 로그인 프론트와 백엔드를 담당했다

프론트는 여러 사이트를 참고하며 만들었고
백엔드는 수업자료를 바탕으로 고안해 봤다
어제까지는 유저 확장을 안 했다가 오늘은 장고 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 하나에 전화번호랑 이메일을 다 받았다고 하셨다

로그인 - 회원가입 -로그인 창까지 다시 오는 건 성공했는데
로그인 성공하면 나오는 페이지나 로그인 실패했을 때 나타나는 에러 표시가 뜨지 않는다
다시 수정해야 할 거 같다

0개의 댓글