프로젝트 : westagram
앱 : account(회원가입,로그인기능), comment(댓글기능)
INSTALLED_APPS = [
# 'django.contrib.admin',
# 'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'account',
'comment',
]
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',
]
from django.urls import path, include
urlpatterns = [
path('account',include('account.urls')),
path('comment',include('comment.urls')),
]
프로젝트의 urls.py(최상위 경로)에서는 자동으로 url주소 뒤에 / 가 붙는다.
from django.db import models
class Account(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField(max_length=100)
phone_number = models.CharField(max_length=20)
password = models.CharField(max_length=100)
회원가입시 요구하는 유저의 정보이다.
from django.urls import path
from . import views
urlpatterns=[
path('',views.AccountView.as_view(),name='account'),
path('/signin',views.SignInView.as_view(),name='signin'),
]
localhost:8000/account 로 접속하면 account/views.py에 AccountView 로,
localhost:8000/signin 로 접속하면 account/views.py에 SignInView 로 가게 매핑한다.
import json
from django.views import View
from django.http import HttpResponse, JsonResponse
from .models import Account
# import도 컨벤션의 규칙에 맞게 한다.
class AccountView(View):
def post(self,request):
data = json.loads(request.body)
# post 방식으로 들어온 json형식의 데이터를 받는다. 자동으로 딕셔너리형으로 변환
try:
if Account.objects.filter(email=data['email']):
# 만약 Account db안의 email필드에 post 방식으로 들어온 email과 중복된다면
return JsonResponse({'message':'EMAIL_ALREADY_EXIST'}, status=400)
# 이미 이메일이 존재한다고 Json형식으로 메세지를 날려준다.
else:
# 중복되는 이메일이 없다면 회원가입이 되게 해준다.
Account.objects.create(
name = data['name'],
phone_number = data['phone_number'],
email = data['email'],
password = data['password']
)
return HttpResponse(status=200)
# 간단하게 HttpResponse로 Http응답코드 200을 주어 원활하게 통신이 되었다고 알린다.
except KeyError:
# 만약 키값(필드값)이 덜 들어오거나 많이 들어왔다면
return JsonResponse({'message':'INVALIDE_KEY'}, status=400)
def get(self,request):
# get방식으로 요청이 왔다면 모든 계정의 정보를 json형식으로 준다.
account_data = list(Account.objects.values())
try :
return JsonResponse({'data':account_data}, status=200)
except Account.DoesNotExist:
return JsonResponse({'message':'ACCOUNT_DOES_NOT_EXIST'}, status=400)
class SignInView(View):
# 로그인 기능
def post(self,request):
# post 방식 (로그인) 요청이 왔다면 날라온 이메일과 그 이메일의 패스워드가 일치하는지, db에 존재하는지 유효 검사한다.
data = json.loads(request.body)
try:
user_email =data['email']
user_password = data['password']
if Account.objects.filter(email=user_email):
user = Account.objects.filter(email=user_email).first()
if user.password == user_password:
return HttpResponse(status=200)
else:
return JsonResponse({'message':'INVALIDE_PASSWORD'}, status=400)
else:
return JsonResponse({'message':'EMAIL_NOT_FOUND'}, status=400)
except KeyError:
return JsonResponse({'message':'INVALIDE_KEY'}, status=400)
from django.db import models
from django.utils import timezone
class Comment(models.Model):
author = models.CharField(max_length=100)
text = models.CharField(max_length=1000)
create_date = models.DateTimeField(auto_now_add=True)
author은 작성자, text는 댓글 내용, create_date는 최초 생성날짜를 저장하는 필드이다.
from django.urls import path
from . import views
urlpatterns=[
path('',views.CommentView.as_view(),name='comment'),
]
import json
from django.views import View
from django.http import HttpResponse, JsonResponse
from .models import Comment
class CommentView(View):
def post(self,request):
data = json.loads(request.body)
try:
Comment.objects.create(
author = data['author'],
text = data['text']
)
return HttpResponse(status=200)
except KeyError:
return JsonResponse({'message':'INVALIDE_KEY'},status=400)
def get(self,request):
comment_data = list(Comment.objects.values())
# 댓글 db가 많으므로 리스트형으로 변환한다.
try:
return JsonResponse({'data':comment_data},status=200)
except Comment.DoesNotExist:
return JsonResponse({'message':'COMMNET_DOSE_NOT_EXIST'},status=400)
- AccountView로 get방식으로 통신
http -v localhost:8000/account- AcoountView로 post방식으로 통신 (회원가입)
http -v localhost:8000/account name='kim' email='kim@naver.com' password='1234' phone_number='010'- SignInView로 post방식으로 통신 (로그인)
http -v localhost:8000/account/signin email='kim@naver.com' password='1234'- CommentView로 post방식으로 통신 (댓글생성)
http -v localhost:8000/comment author=kim text='hello world'- CommentView로 get방식으로 통신 (댓글들 보여주기)
http -v localhost:8000/comment