1026 TIL

looggi·2022년 10월 26일
1

스파르타 내배캠 AI-3

목록 보기
48/130
post-thumbnail

🌞 아침퀴즈

🔎 modelserializer로 간단한 GET/POST 응답 서버 만들기

  • rest_framework를 INSTALLED_APPS에 등록
  • articles 앱을 생성 후 INSTALLED_APPS에 등록 후 아래와 같은 model을 만들어주세요.
class Article(models.Model):
	title = models.CharField(max_length=100)
	content = models.TextField()
  • 모델을 DB에 반영
    python manage.py makemigrations/migrate
  • articles의 index라는 함수에 url을 연결
    morning_quiz(프로젝트폴더)/urls.py
    articles/urls.py
  • serializers.py 를 생성 후 아래와 같이 ModelSerializer를 정의
    articles/serializers.py
from rest_framework import serializers
from articles.models import Article

class ArticleSerializer(serializers.ModelSerializer):
	class Meta:
		model = Article
		fields = '__all__'
  • views.py의 index 함수에 아래와 같이 동작하도록 구현(GET/POST)
from rest_framework.response import Response
from .serializers import ArticleSerializer
from rest_framework.decorators import api_view
from .models import Article

# Create your views here.
@api_view(('GET','POST'))
def index(request):
	# GET 요청시 article 객체 모두 response
    if request.method == 'GET':
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles,many=True)
        return Response(serializer.data)
    # (json 형식으로) POST 요청시 생성된 article 객체 response
    elif request.method == 'POST':
        serializer = ArticleSerializer(data = request.data)
        if serializer.is_valid():
            serializer.save()
        return Response(serializer.data)
  • 시리얼라이즈란?

DB data -> JSON

  • 시리얼라이저란?

각 모델 인스턴스를 model_to_dict 과정이 없이 쉽게 직렬화할 수 있게 해주는 것
https://velog.io/@ifyouseeksoomi/DRF-Django-REST-Framework-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%98%88%EC%8A%B5-Serializer

🍋 사물인식 프로젝트 코드리뷰 2일차

🔎 게시글 생성/수정/삭제 기능

💡 알게된 것

  • /admin 페이지에서 내가 장진님이랑 디저트 일일히 다 입력했던거를 어떻게 까먹고 디저트에 어떻게 사진이 저장돼있나 고민하고 있었다 ㅋㅋㅋ
@login_required(login_url='user:signin')
def post_detect(request):
    if request.method == "POST":
        temp_img = TempImg()
        temp_img.image = request.FILES.get('before_image') # 과일(재료)사진
        print(temp_img.image)
        # post_pics/바나나_7ByoVY9.PNG
        temp_img.save() #요건 해줘야함
        
        img_url = temp_img.image #url
        context = pick_img(request,img_url)
        # 사물인식 결과 Saved 1 image to runs\detect\exp48
                
        ing_list = Dessert() ##
        ing_list = Dessert.objects.filter(ingred=context['picked'])
                
        rand_pick = random.choice(ing_list) #같은 과일로 만든 디저트들 중에 하나 랜덤으로 골라서
        context['dess_image'] = rand_pick.image
        context['dess_id'] = rand_pick.id
        context['dess_name'] = rand_pick.dessert_name
        context['dess_ingred'] = rand_pick.ingred
        print('--------------------------',context)
#-------------------------- {'picked': 'banana', 'dess_image': <ImageFieldFile: dessert_pics/바나나팬케이크.jpg>, 'dess_name':'바나나팬케이크','dess_ingred':'banana'}
        return render(request, 'post/post_create.html', context)
    

➡ 컨텍스트를 이렇게 만들면 구성을 자유자재로 할 수 있는 것 같음 객체를 만들면 걔는 모델에 있는 칼럼을 모두 채워줘야하는데(failed notnullconstraint) 얘는 랜더링할 때 쓸 것만 뽑아서.. ⭐⭐⭐⭐⭐ 이게............................... 칼럼 값을 모두 채워야하는게 아니라 칼럼 값중에 null값이 있으면 안된단 뜻인가 아니 근데 그게 그거아닌가...??
➡ if you do not specify null=True, blank=True, it becomes a required field.
When creating or updating the database, Django is constrained to find a default value to fill the field, because Null=False by default. It does not find any because you haven't defined any.

➡ 담에는 이름을 좀 잘 지어야겠다 왜 ing_list가 됐었는지 모르겠다 그래서 나중에 코드 보는데 더 헷갈린듯 erd할 때부터 나중에 바꾸면 되지~ 하지말고 직관적으로 잘 지어야겠다 dess_list로 바꿔야징

  • random 함수 - 반환값은 모두 리스트!

    • random.choice(범위, 가중치) : 중복 허용
      random.choices(range(1, 6), weights = [0.3, 0.2, 0, 0.1, 0.4])
      ➡ 가중치를 줄 수도 있다
    • random.sample(범위, 몇개 뽑을지(=리스트의크기)) : 중복불가
  • POST는 프론트에서 보내준(request) 이미지를 이미지로 불러올 수 없고 경로만 저장이 된다/ FILES는 이미지로 불러올 수 있다 & enctype = multi~ 가 없으면 이미지 파일 확장자가 이상하게 저장이 된다 rff??

  • 게시글 만들 때 POST, FILES로 가져오되, 객체에 따로 저장(save())하지말고 장고 내장함수 create를 쓸 수 있다
    Post.objects.create(객체를 구성하는 요소(칼럼)가 모두 필요)
    ➡ To create and save an object in a single step, use the create() method.
    When instantiating, Django doesn’t hit the database until you explicitly call save().
    from blog.models import Blog
    ➡ b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
    b.save() 안에 다 넣어줘버려도 되는거였군...!!

  • 모델을 만들 때 class Meta 부분에 ordering을 주면 나중에 게시글 정렬 순서를 views.py에서 따로 orderd_by이런식으로 붙이지 않아도 된다
    ➡ context['posts'] = Post.objects.filter(author=user_id).order_by('-created_at')
    이 경우를 말하는 것 같은데 메타에서 오더링하는 경우는 전체를 그 필드의 값을 기준으로 정렬하게 되는거라서 좀 다르지 않나..??? 흠흠흠흠흠 나는 그 필드 값만 정렬을 주고싶은건데 다른것도 그렇게되면 안되지않나

  • get_object_or_404 vs get_list_or_404
    multiple objects returned 인 경우 후자를 사용
    ➡ func(Model혹은queryset, 필터링할 조건)

🎃 장고 심화 3주차 ~ 끝!

🍭 로그인 인증 방식 : 토큰 vs 세션

  • authenticate를 이용 ➡ 세션이 db에 생성되고 쿠키(공간)에 세션 정보가 전달돼서 전달
    ➡ stateless 하지 않다 : 세션이 남지 않으면 지속성이 떨어지고 db에 과부하 여러 기기로 한 계정으로 로그인하는 경우에 대응이 어려움

  • 토큰을 사용
    ➡ 사용자의 정보가 담긴 토큰을 돌려보내주고 이걸 로컬스토리지에 저장
    로컬스토리지는 만료일이 정해져있지 않다
    많은 양의 데이터를 저장할 때 유리
    프로젝트 파일에서 지정하는 방식? 이 더 간단하다(쿠키는 장고에서 알아서 authenticate를 통해서 저장)

  • pip install django djangorestframework djangorestframework-simplejwt
    ➡ 이렇게 여러개의 패키지를 동시에 설치할 수 있다

  • 브라우저> 개발자도구 - application - storage에서 스토리지 확인 가능

  • 포스트맨에서 로그인할때 꼭 비번은 스트링으로!!
    제대로 로그인하면 access, refresh가 나옴

  • access 토큰은 기한후 만료 - 자동으로 로그아웃됨
    access가 만료되면 refresh 토큰으로 access 재발급 가능 ➡ 보안상의 이유로 사용
    토큰을 사용하면 장고에서 db를 찾아보지 않아도 된다

  • 정보가 토큰에 있는지 db세션에 있는지가 가장 큰 차이!!!!!

🍭 페이로드 항목 업데이트하기

🍭 access 토큰 재발행!

🍭 기타

  • 모델.objects.all() 또는 filter()은 결과값이 없어도 결과물은 queryset이기때문에 many=True가 꼭 필요하다
  • 시리얼라이져에서 객체 생성시 반드시 .is_valid()먼저 실행 후 save()
    ➡ 유효성 검사에서 .is_valid(raise_exception = True) 이렇게하면 기본적으로 400에러를 띄워준다

🍭 오류

  • 노란색으로 표시한 부분 잘 체크하기⭐⭐⭐
profile
looooggi

0개의 댓글