backend django #4 Account app API구현하기

eunji hwang·2020년 4월 9일
0

BACKEND-PYTHON-DJANGO

목록 보기
9/28
post-custom-banner

Account앱 API구현

기능

  • 회원가입
  • 로그인
    • JWT 발급

회원가입

import json  # json 으로 변환할때 필요

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

# DB가져오기
from .models import User

class SignUp(View):
    def post(self, req):
        data = json.loads(req.body)
        # print('username -', data['user_name'])
        # print('password -', data['password'])
        user_name = data['user_name']
        password = data['password']
        # id = 6~12자 사이 영문 대소문자+ 숫자0-9 만가능
        # pw = 영문 대소문자+숫자 0-9+특수문자 ~!@#$%^&*_+?,. 최대 25자 가능
        # user_list = User.objects.all()  # 데이터테이블 전체 가저오기

        if User.objects.filter(user_name=user_name).exists():
            return JsonResponse({'message': '사용할수 없는 아이디'}, status=200)
        else:
            User(user_name=data['user_name'], password=data['password']).save()
            return JsonResponse({'message': '성공'}, status=200)

아이디/비밀번호의 유효성확인도 하고 싶은데 아직 ...핳, 기본적인 기능만 구현했다.

  • POST로 요청을 받는다
  • req.body에 위치한 정보를 json.loads()를 통해 읽어 변수에 담았다.
  • DB User 테이블에서 입력받은 user_name이 있는지 확인, 있다면 응답 : 사용할수 없는 아이디
  • user_name이 없다면 DB에 내용을 추가한 뒤 응답 : 성공메세지

로그인

토큰 발행하기

pip install jwt
pip install pyjwt

import json  # 제이슨으로 변환할때 필요
import jwt

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

# DB가져오기
from .models import User

class SignIn(View):
    # 로그인 로직
    def post(self, req):
        data = json.loads(req.body)
        user_name = data['user_name']
        password = data['password']

        user_info = User.objects.filter(user_name=user_name)
        # print('유저네임: ', user_info[0].user_name)
        print(bool(user_info))
        if user_info:  # 유저정보가 있을 때
            if user_info[0].user_name == user_name and user_info[0].password == password:
              # jwt로 encode하면 byte로 바뀐다 그래서 문자열로 변환하는 것이 필요하다. 변환은 decode('utf-8')을 통해 진행한다. .. 만약 디코드 안하고 응답보내면 500에러~~
                token = jwt.encode(
                    {'user_name': user_name}, 'SECRET', algorithm='HS256').decode('utf-8')
                return JsonResponse({'token': token}, status=200)
            else:
                return JsonResponse({'message': '비밀번호 틀림'}, status=400)
        else:
            return JsonResponse({'message': '없는 유저'}, status=400)

jwt.encode({인코딩할 내용 객체}, 시크릿키, algorithm='HS265').decode('utf-8')

  • 인코딩을 하면 문자는 byte로 변환. 응답으로 넘겨주면 500에러가 발생한다.
  • 인코딩을 한 뒤에는 디코딩을 하여 문자열로 바줘야 한다. 예제코드에서는 utf-8 으로 디코딩해주었다.

내 ip 확인

터미널에 ifconfig를 입력하면

  • id 0x4 inet 이하 숫자.숫자.숫자.숫자 를 찾으면 된다.

장고에서 서버를 열때 python manage.py runserver 0:8000으로 한 뒤 내 아이피를 확인하여 연결, 접속 할 수 있다.

프론트엔드에서 연결하기

api를 구현하고 프론트엔드와 로그인 화면을 붙여보았다. 요청이 들어올때

Access to fetch at 'http://000.00.00.000:8000/account/sign_in' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

에러가 난다. 해결법은 아래 cors를 설치하고 프로젝트 settings.py를 수정해 주어야 한다.

cors 설치

pip install django-cors-headers
설치하면 cors 에러를 해결 할 수 있다. 보안설정

승현님의 블로그정리 보기

settings.py 수정

INSTALLED_APPS 추가

INSTALLED_APPS = [
     # 중략
    'corsheaders'  # CORS 추가 : 보안설정
]

MIDDLEWARE 추가

MIDDLEWARE = [
     # 중략
    'corsheaders.middleware.CorsMiddleware',  # CORS 추가 : 보안설정
]

cors설정 추가

# settings.py 최하단에 추가하자

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
)

CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)
profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!
post-custom-banner

0개의 댓글