(TIL14) Django 회원가입/로그인 기능 구현

SooHyung Kim·2020년 4월 12일
2

django

목록 보기
2/5

인스타그램 회원가입/로그인을 위한 프로젝트 및 앱 생성

1. 프로젝트 생성 및 세팅

  • 프로젝트 생성 :django-admin startproject westagram
  • settings.py에서 인증, 관리자모드 관련된 내용 주석 처리(현재 단계에서는 미사용)
  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에서 관리자 관련 내용 제거 후 migration 진행

2. 회원가입 및 로그인 페이지 작성

  • 앱 생성 : python manage.py startapp user

  • settings.py에서 installed app에 user 앱 추가

  INSTALLED_APPS = [
      # 'django.contrib.admin',
      # 'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      'user',
  ]
  • models.py : 데이터베이스와의 연동을 위한 모델 작성

    • 회원가입 및 로그인에서는 유저아이디, 이메일, 패스워드만 필요하다고 가정

    • django.db내의 models를 import하였으며 장고와 데이터베이스를 연결해주는 ORM 입력

    • sqllite3 내의 User 테이블을 더욱 명확하게 표현하기 위해서 db_tables = 'users'를 지정
      (항상 클래스명은 단수로, 테이블명은 복수로 지정해야 함)

    • models.py의 작성 후에는 makemigrations, migrate를 진행하고, 뒤에는 앱 이름을 넣어주는 것이 바람직함

user/models.py

from django.db import models

class User(models.Model):
    user_id     = models.CharField(max_length = 20)
    email       = models.EmailField(max_length = 30)
    password    = models.CharField(max_length = 20)

    class Meta:
        db_table = 'users'
  • views.py : 프론트앤드 혹은 서버에서 온 요청을 클래스와 함수를 통해 어떻게 응답할 것인가를 작성하는 파일

    • post로 요청받았을 경우에는 그 성격상 기저장된 데이터베이스 내의 데이터의 수정, 생성 등을 통한 데이터의 응답을 주로 실시
    • get로 요청받았을 경우에는 데이터베이스 내의 데이터를 보여주는 형태의 응답을 주로 실시
users/views.py

import json

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

from .models import User
  • 파이썬에서 import해온 json
  • 장고에서 import한 View, JsonResponse
  • 현재의 models.py에서 가져온 User 클래스
class CreateView(View):
    def post(self, request):
        data = json.loads(request.body)
        User(
            user_id     = data['user_id'],
            email       = data['email'],
            password    = data['password'],
        )

        if User.objects.filter(user_id = data['user_id']).exists() == True:
            return JsonResponse({"message" : "이미 존재하는 아이디입니다."}, status = 401)

        else:
            User.objects.create(user_id = data['user_id'], email = data['email'], password = data['password'])
            return JsonResponse({"message" : "회원으로 가입되셨습니다."}, status = 200)
  • 위코드에서 뷰파일은 클래스 형태로 뷰파일을 작성(멘토님께 여쭤본 후 수정)

  • json 형태로 저장된 request.body(강의 참고)를 data라는 변수에 저장

  • 장고 view 파일에서는 데이터베이스와 연관된 문법을 혼용하여 사용할 수 있음. 이를 파악하는 데 시간이 다소 소요되었음

    • if User.objects.filter(user_id = data['user_id']).exists() == True:
      (유저 데이터베이스 내에 요청받은 유저아이디가 있을 경우 True)

    • else에는 일치하는 유저아이디가 없을 경우에 User 데이터베이스에 아이디, 이메일, 패스워드를 생성하여 저장한 후 응답을 전송

    def get(self, request):
        users = User.objects.values()
        return JsonResponse({"data" : list(users)}, status = 200)
  • get 메소드일 경우에는 데이터베이스 내 유저의 데이터를 응답함

3. 로그인 구현

class LoginView(View):
    def post(self, request):
        data = json.loads(request.body)
        User(
            user_id     = data['user_id'],
            email       = data['email'],
            password    = data['password']
        )

        if User.objects.filter(user_id = data['user_id'], password = data['password']).exists() == True :
            return JsonResponse({"message": "로그인에 성공하셨습니다."}, status = 200)
        else:
            return JsonResponse({"message" : "아이디나 비밀번호가 일치하지 않습니다."}, status = 401)

    def get(self, request):
        user = User.objects.values()
        return JsonResponse({"list" : list(user)}, status = 200)
  • 회원가입의 내용과 크게 다른 내용은 없음

api 엔드포인트를 위한 url 파일 작성

urls.py

from django.urls import path, include

urlpatterns = [
    path('user', include('user.urls')),
]
  • 경로를 지정해주는 path함수와 내부 파일로 포함되는 include 함수를 import

  • path 함수의 첫번째 인자에는 엔드포인트가 삽입되는데, 메인 url 파일에서는 / 없이 지정

    • 장고에서는 127.0.0.1:8000/ 처럼 미리 /를 처리하기 때문에, /user일 경우 8000//user와 같은 경우가 발생하므로 / 없이 지정
    user/urls.py
    
    from django.urls import path
    from .views import CreateView, LoginView
    
    urlpatterns = [
        path('/create', CreateView.as_view()),
        path('/login', LoginView.as_view())
    ]
  • 메인 urls.py와는 달리 path 내 첫번째 인자에는 원하는 엔드포인트 앞에 /를 작성해주며, 두 번째 인자에는 view파일을 지정

  • as_view()를 통해 요청받은 메소드의 형태를 장고에서 알아서 구별해냄

모두 완료가 되었으면 postman 혹은 httpie를 통해 직접 확인

profile
Slow and steady win the race

0개의 댓글