25. TIL Westagram (Django초기셋팅,모델링,회원가입구현)

dream.log·2021년 7월 24일
0

TIL

목록 보기
23/42
post-thumbnail

기대 반, 두려움 반! 드디어 Westagram을 만들어보는 시간이다!

기존 과제를 수행하는데 있어, 동기들에 비해 시간이 좀 오래 걸렸던터라 뒤쳐지지 않고 시간 내 해야 할 과제를 모두 하는 것을 목표로 삼고 시작했다.

데이터베이스를 날려먹고 초기셋팅을 다시 해봤었던 것이, 경험으로 쌓였던 것 일까.
다행히도 초기셋팅은 꽤 빠르게 마무리 할 수 있었다.

1. Django 초기 셋팅

터미널 세개 정도를 띄워놓고 작업을 하면 편하다.
Mysql, runserver, 기본 작업 터미널.

- conda 환경 설정
원하는 디렉토리로 이동한 후, conda의 가상환경을 켜준다!

conda create -n westagram python = 3.8
conda activate westagram

- Mysql 터미널 셋팅

mysql -u root -p : 비밀번호 입력하기
CREATE DATABASE westagram CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

- git clone 하기
[현재 위치한 디렉토리를 git repository로 만들기]
git clone을 할 때는 init할 필요없이 복사한 디렉토리 주소를 넣어주면 된다.
git "복사한 주소" .
뒤에 꼬오옥~ . 을 찍어준다!!

[현재 위치한 디렉토리에 git repository 생성하기]
git clone "복사한 주소"

- pip install하기
django, mysqlclient, django-cors-headers, PymySQL
conda install -c quantopian mysqlclient
M1 mysqlclient 오류 날 경우 conda로 설치하는 방법!

- Django Project 설정하기

git checkout -b feature/dodam-initial-setting

checkout -b 를 사용하면 branch를 생성함과 동시에 checkout도 돼서 아주 편리하다! 😋

django-admin startproject westagram
django 프로젝트 시작하기!

- settings.py 설정하기
: IP 허용, 미사용앱 주석처리 및 사용 앱 입력 (corsheader)
그에 따른 corsheader 특이사항 수정하기!

admin, auth, csrf를 주석처리 합니다.
secret_key를 미리 복사해놓자!

ALLOWED_HOSTS = ['*'] : 모든 IP 허용

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

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
#    'django.middleware.csrf.CsrfViewMiddleware',
#    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

-urls.py 설정 확인하기

from django.urls import path

urlpatterns = [
]

- my_settings.py 생성하기
: database ENGINE = 'django.db.backends.mysql'
설정이 되어있지 않으면 데이터베이스 오류가 난다.. 꼭 확인!
Name도 mysql database의 이름과 같아야하니
스펠링 입력에 유의하도록!

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Westagram',
        'USER': 'root',
        'PASSWORD': 'DB접속용 비밀번호',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

SECRET_KEY = '시크릿키' #settings.py에 있는 secret_key 를 사용합니다.

-settings.py <-> my_settings.py 연동 및 coresheader 수정

from pathlib        import Path #기존에 settings.py 에 있는 코드
from my_settings import DATABASES, SECRET_KEY
import pymysql
pymysql.install_as_MySQLdb()
...

DATABASES = DATABASES

SECRET_KEY = SECRET_KEY

INSTALLED_APPS = [
...
		'corsheaders'
]
MIDDLEWARE = [
	...
		'corsheaders.middleware.CorsMiddleware',
	...
]

#REMOVE_APPEND_SLASH_WARNING
APPEND_SLASH = False

##CORS
CORS_ORIGIN_ALLOW_ALL=True
CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
)

CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
		#만약 허용해야할 추가적인 헤더키가 있다면?(사용자정의 키) 여기에 추가하면 됩니다.
)

- requirements.txt 생성하기
: 동일한 개발환경을 구축하기 위해 manage.py가 있는 곳에서 커맨드를 작성해야 한다.

pip freeze

touch requirements.txt
vi requirements.txt

Django==3.2.4
django-cors-headers==3.7.0
mysqlclient==2.0.3

PyMySQL==1.0.2

- .gitignore 생성하기
gitignore 사이트를 활용해 git에 올라가면 안되는 내용들을 입력해준다.
복붙한 내용을 파일에 입력하고, 하단에 my_settings.py를 입력해
중요한 정보들이 올라가지 않게끔 관리해준다!

python, linux, macOS, VisualStudioCode,pyCharm, vim, Zsh

  • runserver 돌려보기.
    python manage.py runserver
    계속 서버를 켜놓고 오류가 나는 부분이 있는지 체크해본다!

☑️ 자주 실수하는 부분
1) setting.py my_settings.py가 아니고 my_settings 이다!

from my_settings import DATABASES, SECRET_KEY

2) settings.py install app 추가 후 , 찍기

- git pull request 하기

git add . : 전체를 .add
git add users/urls.py : urls.py 파일만 업로드!
git commit -m "메시지 입력"
git push origin feature/dodam-initial-setting

git에 업로드를 진행해준다. 작업 완료 후 github에 PR을 올려 컨펌을 받는다! 🙂

2. 모델링

- git 새로운 브랜치만들기
git checkout -b feature/dodam-models

- User app 만들기
python manage.py startapp users
manage.py가 있는 디렉토리에서 실행해야 한다!

- settings.py에 user app 추가하기!
: 빼먹지 말쟈아!

- 모델링 진행하기
필수로 들어가야 하는 정보들
: 이름, 이메일, 비밀번호, 연락처, 그 외 개인정보

✅ 나의 모델

from django.db import models


# Create your models here.
class User(models.Model):
	name 		 = models.CharField(max_length=45)
	email	 	 = models.CharField(max_length=200, unique=True)
	password 	 = models.CharField(max_length=200)
	phone_number = models.CharField(max_length=20)
	birthday	 = models.DateTimeField()

	class Meta:
	   db_table = 'users'

🔥 작성 주안점
🌱 User라는 class를 만들고 이름, 이메일, 비밀번호, 휴대폰 번호를 내부에 넣는다.
그 외 개인정보를 넣는데, 처음 작성한 코드에는 그 외 개인정보가 정말로 그외...(인스타로 치면 소개?)정도로 생각을 해서 etc_inform으로 작성을 했었다.
좀 더 구체적으로 작성해야 한다고 멘토님의 피드백을 받고, 해당 사항을 birthday로 수정했다.

🌱 이제.. 각각의 항목에 알맞는 field를 넣어주어야 했는데,
이름과 이메일은 CharField 를 넣어야겠다고 생각했다!
password와 phone_number에 기존에 배운 양수가 나올 때 사용하는 postiveIntegerfield를 사용하면 좋을 것 같다고 판단했다.
하지만.. 비밀번호와 폰 넘버에 positiveIntegerField 를 사용하는 것은 잘못된 판단이었다.
비밀번호엔 문자,숫자,특수문자가 들어가야하며,
휴대폰 번호에 해당 값을 대입하면 처음 0이 표현되지 않는다! 그렇기에 CharField 로 변경해주었다.

🌱 생일을 나타나는 Field는 처음 사용해보는 DateTimeField 를 사용했다. 사용자가 입력한 값으로 추후에 수정을 할 수 있다! 형태는 YYYY-MM-DD 로 나오니, POST 할 때 참고!

🌱 email은 값이 한개만 존재해야하니, Unique = True 값을 준다!

👩🏻‍💻 컨펌 후 수정내역

  • phone_number, password field값 수정하기
  • etc_inform => birthday로 구체화하기
  • Password는 공백이 될 수 없으니 null=false 값을 줄 필요가 따로 없다!

3. 회원가입 기능 구현하기

✅ 나의 뷰

import json, re
#json과 re정규식을 사용한다
from django.views import View
from django.http import JsonResponse

from users.models import User

#비밀번호 정규식 : 8자이상, 문자, 숫자, 특수문자 사용필요
password_regular = re.compile("^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$")
class UserView(View):
	def post(self,request):
		try:	
			data = json.loads(request.body) # 프론트가 requset한 정보를 바디에 담아 json 을 활용해 읽어내겠다는 의미 
			# 중복에러 설정하기
			if User.objects.filter(name=data['name']).exists() or User.objects.filter(email=data['email']).exists(): 			
				return JsonResponse({'MESSAGE': 'DATA_OVERLAP'}, status = 400)		

			# 이메일 필수조건 설정 및 패스워드 설정 관련 정규식 : 8자이상, 문자, 숫자, 특수문자 조건 충족
			if ('@' not in data['email']) or ('.'not in data['email']) or (not password_regular.match(data['password'])):
				return JsonResponse ({'MESSAGE': 'INVALID_FORMAT'}, status = 400)


			User.objects.create(
			name 		 = data['name'],
			email	 	 = data['email'],
			password	 = data['password'],
			phone_number = data['phone_number'], 
			birthday 	 = data['birthday'],
			)
			return JsonResponse ({'MESSAGE' : 'SUCCESS'}, status = 201)

		except KeyError: # 키 값이 빠진다면 나오는 오류
			return JsonResponse ({'MESSAGE': 'KEY_ERROR'}, status = 400)

✅ urls.py 변경하기
<users/urls.py>

from django.urls import path
from .views import UserView, LoginView

urlpatterns = [ 
	path ('', UserView.as_view()),
	path ('/login',LoginView.as_view()),
]

<westagram/urls.py> : 없으니 새로 만들어주어야함

from django.urls import path, include


urlpatterns = [
    path('users', include('users.urls'))
]

🔥 작성 주안점
🌱 아직 여러 구문을 사용하는데엔 익숙하지도 않고, 최대한 직관적으로 구문을 쓰고 싶었다...! 잘 모르는 부분은 구글링을 많이 하긴했지만... 정규식을 하나 사용하여야 하는 것이 과제였기 때문에, 정규식에 대한 정보를 이리저리 찾아보았고, 비밀번호에 정규식을 사용하기로 했다.

🌱 여러 에러에 대한 조건 설정이 필요했다. 이메일이나 같은 이름이 존재한다면? 가입이 어렵기 때문에 조건을 걸어주어야겠다고 생각했고, 지난 시간 배운 mysql method들 중
exists()가 떠올랐다. 해당 개념을 활용해,중복을 체크하는 구문을 작성했다.

🌱 이메일에는 @와 .이 존재하지 않으면 양식에 맞지 않는다. 해당 조건도 수식화 해주어야 했는데, 쉽게 아이디어가 떠오르지 않았다..한참 찾아보다 if not 구문을 활용하게 되었다.

👩🏻‍💻 컨펌 후 수정내역

  • if not으로 연결된 두 문장과, 이메일과 같은 이름이 존재하면 아이디가 만들어지지 않는 두 문장은 같은 에러를 반환하고 있었다. 그렇기에 or을 활용해 하나의 문장으로 묶어주면 깔끔하다는 컨펌을 받아 수정했다.
    다만, 문장이 많이 길어지는 것 같아 아쉽다. 이러한 경우에는 어떻게 표현하는 것이 더욱 효율적일지 궁금하다!

  • import와 from 순서에 맞추어 정렬하기.
    하나의 import에 json과 re를 함께 엮어주고, http, view, models, db의 순으로 적어주었다.
    파이썬 자체의 모듈, 장고 모듈, 내가 만든 클래스의 순이고 import에도 순서가 있다고 멘토 연우님께서 말씀해주셨는데, 순서는 정확하게 어떻게 되는지도 공부해봐야겠다!

  • Unique = true IntergrityError 삭제하기
    상단에 이미 중복값을 검증하는 로직을 작성했는데, except 구문으로 해당 에러에 대한 구문을 한 번 더 적었었다. 필요가 없는 부분이라는 컨펌을 받고 삭제-!

🌈 회원가입 구현 후 가입완료한 10명의 회원님들

최근에 슬의생2를 인상깊게 보고 있어 등장인물들을 가입시켜보았다 ㅎㅎ
Post로 회원 가입을 시도하려는데, 데이터베이스와 Mysql을 맞게 설정했음에도 404에러가 뜨고 가입이 되지 않아
또 다시 migrate를 하고 수정을 해야하는줄 알고 식겁을 했다 🥺
Mysql insert로 1명 강제 가입을 시켜준 후, Post의 작성내용에 수정을 거듭하다보니, 결국 되었다-
아직 익숙하지 않아 생긴 문제였다....ㅠㅠ
Post와 Get의 개념을 다시 한 번 정리하고, Post도 익숙해져야겠다는 교훈을 얻었다.


드디어 westagram 제출 과제 부분의 반?을 마쳤다.
모델과 뷰를 작성하는데 있어 아직은 익숙치 않아
구문이 맞는지 검증이 필요하고, 미숙한 부분은 구글링의 도움을 많이 받고 있다.
나 스스로 모델과 뷰를 완벽하게 작성할 수 있는 그 날까지-!!!!!!
ipython에 작성한 구문이 맞게 실행되는지 찍어보자!

profile
한 걸음, 한 걸음 포기하지 않고 발전하는 Backend-developer 👩🏻‍💻 노션 페이지를 통한 취업 준비 기록과 회고를 진행하고 있습니다. 계획과 기록의 힘을 믿고, 실천하고자 합니다.

0개의 댓글