21.2.27

커피 내리는 그냥 사람·2021년 2월 27일
0

위코드 pre코스

목록 보기
25/28

<Django CRUD 2.1>

CRUD1에서 만든 데이터베이스 및 모델에 HTTP 리퀘스트(GET, POST) 주기 실습 과제 + 추가 사항

1. views.py에서 코드 작성 중 유의했어야 했던 파트

  1. many to many 관계에서 요청한 내용의 쿼리셋을 id로 풀면 id 값으로, name으로 풀면 name으로 가는 것을 발견했다.
class AllergyDrinkView(View):
    def get(self, request):
        allergies = Allergy_drink.objects.all()
        result    = []
        
        for allergy in allergies:
            my_dict={
                'allergy_drink' : allergy.allergy_drink.id,
                'drink'         : allergy.drink.id
            }
            # name으로 바꾸면 알러지와 음료 이름이 매칭 된다.
            result.append(my_dict)
        return JsonResponse({'result' : result}, status = 200)

내 생각 : 근데 클라이언트에게 굳이 id값을 풀어서 줘야할까?라는 생각도 들었다. 왜냐면 클라이언트는 음료와 알러지의 상관관계가 알고 싶은 것이지(어떤 알러지가 있니?) 그 아이디값이 뭐인지는 중요하지 않을 것 같기 때문이다.

  1. (1과의 관계에 연속) 요청이 id 값으로는 들어올 수 없다.

    def post(self, request):
        data  = json.loads(request.body)
        name  = Allergy.objects.get(name=data['allergy_drink'])
        #가져오려는 클래스가 Allergy였으므로 name이 맞고 데이터 상에는 'allery_drink'니까
        drink         = Drink.objects.get(korean_name=data['drink'])
        allergy_drink = Allergy_drink.objects.create(
            allergy_drink = name,
            drink         = drink
            # 실제 httpie에서 받는 값(실제 쿼리가 변화되는 과정이므로)
            # (추측) id값으로 하면 어떨까? ; 쿼리에러남
            #products.models.Allergy.DoesNotExist: Allergy matching query does not exist.
        )   # 생각해보니 클라이언트는 아이디값을 알 리가 없다.
        return JsonResponse({"MESSAGE" : "SUCCESS"}, status=201)

내 생각 : 클라이언트 입장에서 쿼리셋 안에 아이디 값을 알리가 없다. 그런데 요청을 아이디값으로 해서 POST를 한다? 이건 말이 안 된다. 그러므로 name, drink로 하는 것이 맞다.

  • 추가 : def post 바로 맡에 들어가는 함수의 내용은 해당 클래스에서 name값으로 쓸 데이터의 이름을 지정하는 곳이다. 따라서 무턱대고 그냥 위의 사례에서 name을 줬으니 아래도 name을 줘야지 하면 절대 되지 않는다. 위에 다른 코드에서 drink도 실컷 한국이름, 영어이름이라고 나눠놓고 name이라고 줘서 attribute에러를 내곤 했다. 주의하자.
  1. httppie에서 POST 내용이 모두 맞는데 자꾸 에러가 나는 경우 : 띄어쓰기가 무조건 잘못되었다는 뜻이다.(500에러가 아닌 이상) 파이썬에서 indent가 중요하듯 http에서도 = 양 옆으로 띄어쓰기를 하지 않는 것이 옳다.

당시 에러 : http: error: argument REQUEST_ITEM: 'image_url' is not a valid value


2. GitHub에 자료 업로드 PUSH하기

1. 사전 작업 : 보안

1. settings.py 에 SECRET_KEY 변경 및 분리

(참고 블로그)

나는 이번에 비밀파일패턴을 이용해서 했다.
1. 먼저 시크릿 키를 프로젝트 디렉토리 내 secrets.json이라는 파일을 만들어 거기에 잘라넣기를 해준다.

{
"SECRET_KEY" : "본인의 키"
}

이 때 무조건 쌍따옴표를 써야 한다. 안 그러면 저장이 안 된다.

  1. 만들어진 파일은 깃허브에 저장되지 않도록 .gitignore 문서에 추가한다. 이는 뒤에서 다시 다뤄본다.

  2. settings.py를 수정한다.

from pathlib import Path
import os, json
from django.core.exceptions import ImproperlyConfigured


# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 경로 에러 났던 것 해결한 코드.   
secret_file = os.path.join(BASE_DIR, 'secrets.json') # secrets.json 파일 위치를 명시

with open(secret_file) as f:
    secrets = json.loads(f.read())

def get_secret(setting, secrets=secrets):
    """비밀 변수를 가져오거나 명시적 예외를 반환한다."""
    try:
        return secrets[setting]
    except KeyError:
        error_msg = "Set the {} environment variable".format(setting)
        raise ImproperlyConfigured(error_msg)

SECRET_KEY = get_secret("SECRET_KEY")
  • 중간에 시크릿파일을 못 찾아서 경로 에러가 났는데 다른 블로그 통해 BASE_DIR 의 절대 경로를 찾는 방법을 습득해서 해결했다. 아마 노트북이나 시스템에 따라 다를 수 있다.(나는 가상환경이다.)
2. DATABASES 내용 분리하기

시크릿 키 외에도 데이터베이스 내용은 mysql 비밀번호 등 굉장히 중요한 내용들이 많아 깃허브에 그대로 업로드 될 시 경고 메일을 받을 수도 있다. 따라서 이 내용도 따로 보안을 위해 분리해놓는 것이 좋다.

  1. 먼저 똑같은 방식으로 my_settings.py를 프로젝트 디렉토리에 만든다.
  2. 데이터베이스 내용을 그대로 옮겨놓는다.(잘라넣기)
  3. 이 옮겨진 내용을 settings.py에서 불러온다.
from . import my_settings

DATABASES = my_settings.DATABASES
# 상대경로 이용

왜 상대경로 이용?? : 상대경로로 바로 그 자리에서 my_settings.py를 불러오기 위한 것이다.

2. .gitignore 파일을 만든 뒤 추가하기

  1. https://www.toptal.com/developers/gitignore 로 들어가

    python, pycharm, vscode, vim, macOS, Linux, zsh

키워드를 잘 선택하여 만들기를 누르면 흰 화면에 여러 글자가 인쇄된 장면이 나온다.

  1. 이 텍스트들을 모두 복사하고 커맨드 화면으로 들어간다.

  2. 프로젝트 폴더로 디렉토리를 이동한 후 .gitignore을 생성 후 vim으로 들어간다. 이후 복사한 내용을 붙여 넣고 아래 자리에 올라가선 안 될 위의 두 파일의 이름을 넣는다.

이후 깃에서 깃허브로 push하면 끝난다.

사실 settings.py 내용을 위의 두 가지 모두 한꺼번에도 처리 가능하다. 이번에 나눠서 확인해본 것은 처음 실습이었고 여러 방법이 있다는 것을 알기 위함이니 다음에는 한꺼번에 다시 도전해봐야겠다.

도전 결과 : 데이터베이스와 키값은 따로 저장하는게 맞다. 둘 다 하니까 가디언스 메일이 왔다.

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글