본문 바로가기
패스트캠퍼스

[패스트캠퍼스] 파이썬 강의 7주차 / Django

by 리잼 2022. 10. 4.
반응형

실전 프로젝트

  • 프로젝트 Task
    1. Front-End
      • 메인 랜딩 페이지
      • 로그인 / 회원가입 페이지
      • 비밀번호 찾기 페이지
      • 이메일 인증
      • URL 단축
      • 통계 페이지
      • 회원 개인 프로필 설정
      • 회사 설정
      • Vue.js
    2.  Back-End
      • 정책 수립
      • DB 모델링
      • Rending Views
      • API 만들기
      • Cache 사용
      • Django ORM 이용한 쿼리
    3.  기타
      • 텔레그램 봇 만들기
      • Static File 관리
      • CICD 구성
  • 정책
    1. 기본
      • User당 50개 생성 가능
      • 리프레시 하지 않으면 60일 유효
      • 이메일 미인증시 사용 불가
      • 1초에 같은 IP에서 5회이상 호출 불가
      • 기본통계 제공
      • 302 리턴
    2. 유료
      • 무제한 생성 가능
      • 삭제할때 까지 삭제되지 않음
      • 이메일 미인증시 사용불가
      • 1초에 같은 IP에서 20회 이상 호출 불가
      • Advanced 통계 저공
      • 301 리턴

 

Rendering Views

HttpResonse

  • Rendering View, Json Response View 모두 API의 일종
  • HTML을 렌더링 하는지, Json의 형태로 단순히 정보만을 주는 차이
  • 렌더링을 해야할 때는 Django의 render를 사용 ( HttepResponse 사용 )
  • Json 포맷으로 전달해야 할 때는 JsonResponse를 사용

RsetAPI

  • Rest ( Representational State Transfer )
    • 프로토콜 아님
    • 표준 아님
  • 특징
    • Uniform
    • Stateless
    • Chacheable
  • 구현
    • Method로 하는 행위 구별
    • Item과 id 와 url에 사용
    • "-"는 가독성을 위해 사용
    • "_"는 사용하지 않음
    • 파일 확장자는 uri에 포함하지 않음
    • 언제나 소문자만 사용

DB 모델링

GCP 접속 > SQL > 인스턴스 만들기

mySQL 선택
인스턴스 생성과 설정
mysqlclient 설치

기본 모델링

DB 생성 > DBeaver 에서 확인
프로젝트 폴더 settings.py 수정

models.py 수정

import string
import random

from django.db import models
from django.contrib.auth.models import User as U

# Create your models here.


class PayPlan(models.Model):
    name = models.CharField(max_length=20)
    price = models.IntegerField()
    updated_at = models.DateTimeField(auto_now=True)
    create_at = models.DateTimeField(auto_now_add=True)

class Organization(models.Model):
    class Industries(models.TextChoices):
        PERSONAL = "personal"
        RETAIL = "retail"
        MANUFACTURING = "manufacturing"
        IT = "it"
        OTHERS = "others"
    name = models.CharField(max_length=50)
    industry = models.CharField(max_length=15, choices=Industries.choices, default=Industries.OTHERS)
    pay_plan = models.ForeignKey(PayPlan, on_delete=models.DO_NOTHING, null=True)
    updated_at = models.DateTimeField(auto_now=True)
    create_at = models.DateTimeField(auto_now_add=True)

class Users(models.Model):
    user = models.OneToOneField(U, on_delete=models.CASCADE)
    full_name = models.CharField(max_length=100, null=True)
    organization = models.ForeignKey(Organization, on_delete=models.DO_NOTHING, null=True)

class EmailVerification(models.Model):
    user = models.ForeignKey(Users, on_delete=models.CASCADE)
    key = models.CharField(max_length=100, null=True)
    verified = models.BooleanField(default=False)
    updated_at = models.DateTimeField(auto_now=True)
    create_at = models.DateTimeField(auto_now_add=True)

class Categories(models.Model):
    name = models.CharField(max_length=100)
    organization = models.ForeignKey(Organization, on_delete=models.DO_NOTHING, null=True)
    creator = models.ForeignKey(Users, on_delete=models.CASCADE)
    updated_at = models.DateTimeField(auto_now=True)
    create_at = models.DateTimeField(auto_now_add=True)

class ShortenedUrls(models.Model):
    class UrlCreatedVia(models.TextChoices):
        WEBSITE = "web"
        TELEGRAM = "telegram"

    def rand_string():
        str_pool = string.digits + string.ascii_letters
        return ("".join([random.choice(str_pool) for _ in range(6)])).lower()

    nick_name = models.CharField(max_length=100)
    category = models.ForeignKey(Categories, on_delete=models.DO_NOTHING, null=True)
    prefix = models.CharField(max_length=50)
    creator = models.ForeignKey(Users, on_delete=models.CASCADE)
    target_url = models.CharField(max_length=2000)
    shortened_url = models.CharField(max_length=6, default=rand_string)
    created_via = models.CharField(max_length=8, choices=UrlCreatedVia.choices, default=UrlCreatedVia.WEBSITE)
    expired_at = models.DateTimeField(null=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(auto_now_add=True)

클래스 상속의 이해

updated_at, created_at 이 반복적으로 사용됨

Timestampmodel 이라는 부모 클래스를 만들어서 상속시켜준다

이렇게 하면 코드도 간결해지고 가독성이 좋아지는 효과~

 

>> python manage.py migrate

>> python manage.py makemigrations shortener

>> python manage.py migrate


 

Django Rest Framework

DRF 란?

  • Django 안에서 RESTful API 서버를 쉽게 구축할 수 있도록 도와주는 라이브러리
  • Micro Framework

Serializer

  • Json >> Python 객체
    Python 객체 >> Json

7주차를 돌아보며

7주차는 강의 내용이 적었다. 이번주는 내리 8주차 까지 끝내고 강의 다 끝나는날 전에 프로젝트 파일까지 제출을 해봐야겠다.

Django 수업 들어와서부터는 강사님이 혼자 막달리기 식이라 계속 얘기했지만 이해하기 너무 어려웠다

중간에 URL 관련 내용은 정리조차 하기 어려운정도 ㅋㅋㅋ 계속 코드를 이리저리 왔다갔다해서 멀미가 났네..

강의 보는 내내 바뀐 코드 찾아 수정하고 에러 뜨면 또 찾아 수정하는 일의 연속 ;; ..

강의 다 듣고나서도 혼자 뭔가 만들어볼 수 있을지 모르겠네

그냥 계속 자바 스프링을 했어야 햇나? 가끔 채용 공고보면 한숨밖에 안나온다.

반응형