(Django) #1: 회원가입 기능의 구현 -revised

Kepler·2020년 2월 9일
0
post-custom-banner
  • 프로젝트명 : Instagram

  • App_1 : Account

장고를 이용해서, 첫번째 프로젝트인 인스타그램 백엔드 클로닝을 진행하고 있다.

첫번째 과제는 회원가입, 로그인, 코멘트 기능을 구현하는 부분이었다. 이 글에서는 회원가입 기능 코드를 작성한 부분을 리뷰한다.

모델 작성하기

회원정보를 가진 모델 클래스를 작성한다.
Account 클래스는 회원이름(name), 이메일주소(email), 비밀번호(password)의 세가지 속성을 갖는다.

@ models.py

from django.db import models    # ORM이 가능하도록 장고에서 models를 import
    
class Users(models.Model):    # models의 내장함수인 Model을 parameter로 받음.
	name       = models.CharField(max_length = 50)
	email      = models.CharField(max_length = 50)
	password   = models.CharField(max_length = 300)
        created_at = models.DateTimeField(auto_now_add = True)
	updated_at = models.DateTimeField(auto_now = True)
    
    class Meta: 
      db_table = 'accounts'

created_atupdated_at의 변수는 장고에서 시간을 자동으로 지정해주는 auto_now_addauto_now를 사용하기 위해 지정해준다. 기록을 남겨주지는 않기 때문에, 기록을 남기고 싶으면 따로 코드를 작성해야 한다.

  • auto_now_add : 최초 DB 입력시간을 뜻한다.
  • auto_now : 변화가 있을 때, 즉 수정했을때의 시각을 의미한다.

Views 작성하기

회원가입은 유저가 입력한 정보를 서버에 전달하여 등록하는 과정이 필요하다. 따라서, 이 부분을 처리할 수 있도록 Views의 함수를 정의해야 한다.

함수를 직접 정의하는 대신, 장고가 제공하는 클래스 베이스 뷰(CBV)를 사용하여, 필요한 부분을 상속받아서 사용할 수 있다. 이번 예제에서는 이 방법으로 회원가입을 구현했다.

완성된 코드는 다음과 같다. 하나씩 차근차근 살펴보자.

@ views.py

import json

from .models import Account

from django.views.import View
from django.http import HttpResponse, JsonResponse

class AccountView(View):
  def post(self, request):
    data = json.loads(request,body)
    
    if Account.objects.filter(email=data['email']).exists():
        return JsonResponse({'message':'USER_EXISTS'}, status = 400)
    Account(
      name     = data['name'],
      email    = data['email'],
      password = data['password']
      ).save()
                      
      return HttpResponse(status = 200)         

Import modules :

  • 유저에게서 전달받을 데이터는 json 포맷이므로, 먼저 json을 import하였다.
  • Accout 클래스를 import하였다.
  • CBV를 import하여 views 클래스의 여러한 기능을 상속받아 쓸수 있도록 하였다.
  • Response 형태는 단순히 status를 리턴해주는 HttpResponse 와 프론트엔드에게 전달할 코멘트를 입력할 수 있는 JsonResponse를 import 하였다.
  • 모듈 import는 기능상 순서가 상관없으나, 가독성을 높이기 위해서 같은 부류의 모듈끼리 묶어주고 띄어쓰기를 하는것이 좋다. 위의 예제에서는 직접 불러오는 모듈(json), app안에서 불러오는 모듈(.models), 장고에서 불러오는 모듈(django.)로 나누었다.

AccountView :

POST:
  • 회원가입은 Http통신 메소드 중, POST를 통하여 이루어진다. POST는 유저가 자신이 입력한 데이터를 서버에 전송하는 기능을 가진다.
  • 유저에게 받을 데이터는 header, body 로 나뉘는데, 회원가입 정보와 같은 유저가 담는 정보는 body 를 통하여 전달된다. 따라서, json데이터를 load하는 json.loads 메소드를 사용하여, body의 정보를 불러오는 코드를 작성하였다.
  • 회원가입을 진행하기 전에, 유저 이메일이 이미 존재하는지를 체크하는 부분을 추가했다. 존재할 경우, status 400의 에러를 리턴한다. 모든 POST는 try/except/keyerror validation을 설정해 주는것을 추천한다
  • Account 클래스에 저장할 데이터를 지정한다. 유저에게서 받은 정보 중 key가 name, email, password인 데이터를 각각 같은 이름의 Account 클래스에 저장되도록 코드를 작성하였다.
  • response는 프론트엔드 개발자가 보게 되는 부분이므로, 약속된 메세지를 보여줘야 한다. 현 단계에서는 단순하게 HttpResponse를 리턴하였다.

URLs 작성하기

프로젝트의 URL 파일과 Account의 URL 파일을 각각 작성해 준다.

# 프로젝트 URLs
@ urls.py

from django.urls import path, include

urlpatterns = [
  path('account', include('account.urls')),
]
  • path 와 include를 import한다. include 메소드는 app의 urls를 참조할 수 있도록 해주는 기능이다.
  • path는 account 로 지정해주었다. 프로젝트 urls에서는 경로의 뒤에 /를 사용하지 않는다. 각 app의 url에서 지할 것이다.
# account의 URLs
@ account/urls.py

from django urls import path
from . views import AccountView

urlpatterns = [
  path('/sign-up', AccountView.as_view()),
  path('', AccoutView.as_view()),
]
  • Views의 AccoutView를 import하여 해당 url 입력시, AccoutView를 표시하도록 설정한다.
  • 경로 앞에 /를 사용하여, account/sign-up 경로를 통하여 접근할 수 있다.
profile
🔰
post-custom-banner

0개의 댓글