위스타그램 1 회원가입기능구현
22 Jul 2021 | 입문 위코드 TIL[Mission 1] Django초기 세팅
지난 게시물을 참고하여 만들 수 있다. makemigrations할 때 프로젝트 안에 앱이 2개 이상일때는 뒤에 앱이름을 붙여주어야한다.
python manage.py makemigrations users
python manage.py migrate users
- 모델 작성
- 프로젝트 settings.py의 installed_app에 앱 이름 추가
- makemigrations 실행
- 상위 프로젝트 폴더의 urls.py에 경로 추가
[Mission 2] 모델링
#yooyoung > users > models.py
from django.db import models
class User(models.Model):
name = models.CharField(max_length=40, null=True)
#null=True를 넣으면 값이 들어오지 않아도 에러가 나지 않는다.
email = models.EmailField(max_length=200, unique=True)
password = models.CharField(max_length=200)
age = models.PositiveIntegerField(null=True)
phone_number = models.CharField(max_length=60, null=True)
class Meta:
db_table = 'users' #디비 이름 네이밍 컨벤션 : 소문자 복수형
[Mission 3] 회원가입 기능 구현
- 회원가입을 위한 View 를 작성해야합니다. 사용자 정보는
이름
,이메일
,비밀번호
,연락처(휴대폰)
,그 외 개인정보
를 포함한다. - 이메일이나 패스워드가 전달되지 않을 경우,
{"message": "KEY_ERROR"}, status code 400
을 반환합니다. - 이메일에는
@
와.
이 필수로 포함되어야 합니다. 해당 조건이 만족되지 않은 경우 적절한 에러를 반환해주세요. 이 과정을 Email Validation이라고 합니다. 정규표현식을 활용해주세요. - 비밀번호는 8자리 이상, 문자, 숫자, 특수문자의 복합이어야 합니다. 해당 조건이 만족되지 않은 경우, 적절한 에러를 반환해주세요. 이 과정을 Password Validation이라고 합니다. 정규표현식을 활용해주세요.
- Email validation, Password Validation 과정에서 정규식을 사용해보세요.
- 회원가입시 서로 다른 사람이 같은 이메일을 사용하지 않으므로 기존에 존재하는 자료와 중복되면 안됩니다. 적절한 에러를 반환해주세요.
- 회원가입이 성공하면 {“message”: “SUCCESS”}, status code 201을 반환합니다.
#yooyoung > urls.py
from django.urls import path,include
urlpatterns = [
path("users",include("users.urls"))
]
#yooyoung > users > urls.py
from django.urls import path
from .views import SignUp
urlpatterns = [
path("", SignUp.as_view())
]
#yooyoung > users > views.py
from django.views import View
from django.http import JsonResponse
from .models import User
import json
import re
class SignUp(View):
def post(self, request):
try:
data = json.loads(request.body)
if User.objects.filter(email=data['email']).exists():
return JsonResponse({"message": "ERROR_EMAIL_ALREADY_EXIST"}, status=400)
#이메일이 디비에 이미 있는 경우 중복에러
if (data["email"] == "") or (data["password"] == ""):
return JsonResponse({"message": "ERROR_EMPTY_EMAIL_OR_PASSWORD"}, status=400)
#이메일이나 비밀번호가 누락된 경우 에러
if re.match(r"^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$", data["email"]) == None:
return JsonResponse({"message": "ERROR_EMAIL_NEED_@AND."}, status=400)
#이메일 형식이 안 맞는 경우 에러
if re.match(r"^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$", data["password"]) == None:
#(알파벳이 있고)(숫자가 있고)(특수문자가 있으면)8자 이상의 해당 문자열을 입력받는다.
# 그래서 특수문자에 넣고싶은 문자가 더 있으면 여기에 추가해주면 된다. 양쪽에 다 추가해야함!
return JsonResponse({"message": "ERROR_REQUIRE_8_LETTER,NUMBER,SPECIAL_SYMBOLS)"}, status=400)
#비밀번호 8자리 이상, 문자, 숫자, 특수문자의 복합아니면 에러
User.objects.create(
name = data['name'],
email = data['email'],
password = data['password'],
phone_number = data['phone_number'],
age = data['age']
)
#그렇지 않은 경우 데이터 저장
return JsonResponse({'Message': 'SUCCESS'}, status=201)
except KeyError:
return JsonResponse({'message': 'KEY_ERROR'}, status=400)
#try: except를 써야 예외처리할 수 있다. 키에러일 경우 키에러를 리턴한다.
쉘로 데이터 입력하기
>>>from users.models import User
>>>User.objects.create(name='경훈',email='123@gmail.com',password='!234567eight', age=18, phone_number='01012345678')
<User: User object (1)>
...
httpie POST로 데이터 입력하기
http -v POST 127.0.0.1:8000/app이름/urls등록한이름 컬럼='' 컬럼=''
공백으로 컬럼을 구분한다.
예를 들자면
http -v POST 127.0.0.1:8000/users name='민' email='min@abc.com' password='*fsgfdlkjhlkjh1' phone='010-1234-5678' age=32
결과값(비밀번호를 대강 쉘로 넣어서 정규표현식이 적용되어있지 않다)