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',
]
앱 생성 : 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 : 프론트앤드 혹은 서버에서 온 요청을 클래스와 함수를 통해 어떻게 응답할 것인가를 작성하는 파일
users/views.py
import json
from django.views import View
from django.http import JsonResponse
from .models import 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)
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)
urls.py
from django.urls import path, include
urlpatterns = [
path('user', include('user.urls')),
]
경로를 지정해주는 path함수와 내부 파일로 포함되는 include 함수를 import
path 함수의 첫번째 인자에는 엔드포인트가 삽입되는데, 메인 url 파일에서는 / 없이 지정
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()를 통해 요청받은 메소드의 형태를 장고에서 알아서 구별해냄