Django 위스타그램 회원가입, 로그인 ,댓글

김병욱·2020년 5월 7일
2

Django

목록 보기
11/15

구조

프로젝트 : westagram
앱 : account(회원가입,로그인기능), comment(댓글기능)

westagram/settings.py


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',
]

westagram/urls.py

from django.urls import path, include

urlpatterns = [
        path('account',include('account.urls')),
        path('comment',include('comment.urls')),
]

프로젝트의 urls.py(최상위 경로)에서는 자동으로 url주소 뒤에 / 가 붙는다.

account/models.py

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)

회원가입시 요구하는 유저의 정보이다.

account/urls.py

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 로 가게 매핑한다.

account/views.py

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)

comment/models.py

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는 최초 생성날짜를 저장하는 필드이다.

commnet/urls.py

from django.urls import path
from . import views

urlpatterns=[
	path('',views.CommentView.as_view(),name='comment'),
]

comment/views.py

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)

httpie 로 엔드포인트가 잘 통신하는지 확인

  • 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
profile
개발스터디

0개의 댓글