본문 바로가기
AI 웹개발반

[TIL] DRF 팀프로젝트 기능 구현 중 : imagefield, tag, 이메일인증

by 째깍단 2023. 5. 10.

오늘 한 것

[O] : feed 기능 완성하기! 

+ file imgfield

+ tag 게시글에 추가하기. many!

+ 인기 순 혹은 관련된 게시글 목록 가져오기

 

[X] : 필수 요구사항 체크하여 db 등 기능 알아보기

 

[X] : JScrud 배우기

 

 

 


기능 구현

 

1. ImageField 

 

 

FileField를 상속받아 이미지를 관리하는 field

 

pip3 install pillow  #필수!

 

  • static : 정적인 내부 파일을 가지고 있는 폴더  = logo, default image 등
  • media : 동적인 파일을 저장하는 폴더 = 사용자가 등록한 자료

 

 

 

#settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')] # 개발단계
# STATIC_ROOT = os.path.join(BASE_DIR,'static') # 배포단계

MEDIA_URL = '/static/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'static/media')

 

manage.py 와 같은 위치에 폴더 만들기

 

 

 

# models.py

class Feed():
    ...
    image = models.ImageField(blank=True, upload_to="media/photo/%Y/%m/%d",
            default='static/default_image.png')
    video = models.FileField(null=True, blank=)
    ...

 

 

upload_to  경로 지정

 

기본 상대 경로는 media/  

이후 폴더 아래에 저장 photo/%Y/%m/%d   (연/월/일)

 

 

default  기본 이미지 지정

 

 

 

더보기

- 배포할 때는 sqlite말고 다른 DB를 사용 (sqlite는 개발용 경량 db)

- mysql 등의 db에 따로 넣고 각각 배포해야한다

 

 

 

자주쓰는 DB :

  •  mysql
  •  mariaDB
  •  postgresql
  •  AWS : RDS

 

기본 정보 :

 

배포 서버 / 포트 / 접속 정보 

 

 

 

django 의 settings.py에 static. media로 image넣기

 

static 자원으로 접근할때 url을 사용

 

...

 

 

 

장고 - 서버db끼리의 주고받는 과정

 

컨테이너를 각각 가지고 있고 각각을 배포하며, 서로 주고받음

 

 

 

 

 

 

 

 

 

 

2. 게시글에 tag만들기

 

 

users.models.py에 있는 Tag 모델

 

class Tag(models.Model):
    name = models.CharField(max_length=32, verbose_name="태그명")
    
    def __str__(self):
        return self.name
더보기

serializers / view 내용

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = ['name', 'id']
    
    def __str__(self):
        return self.name

 

class TagView(APIView):
    def get(self, request):
        tags = Tag.objects.all()
        serializer = TagSerializer(tags, many=True)
        return Response(serializer.data)

 

 

 

팀원분이 만들어놓으신 model을 받아와서 ManyToMany로 추가한다

 

필수 영역으로 blank=False 넣어 필수 입력 필드로 만들어주었다

 

class Feed():
    ...
    tag = models.ManyToManyField('users.Tag', verbose_name = "tag", blank=False)

 

 

 

 

* postman으로 시험

 

 

tag는 출력될시에는 __str__ = self.name

Post 시에는 tag_id(pk값) 들어간 list 받아옴

 

 

list로 넣어주면 잘 작동!

 

순조롭게 불러옴. *오타: default_image.jpg로 변경함

 

 

 

[참조] :

https://pythonblog.co.kr/blog/68/

https://iamthejiheee.tistory.com/63

https://23life.tistory.com/38

 

 

 

 

 

 

 

3. 이메일로 검증하는 절차 만들기   = 튜터님 설명 저장

 

 

 

default=False

 

model에 default False 해두고, 유효성 검사한 결과가 유효하면 True 바꾸어주는 부분!

 

 

1. (유저) 아이디, 이메일, 패스워드를 입력한다

2.(개발자) 아이디, 이메일, 패스워드 유효성을 확인한다

- 아이디 글자수 제한

-이메일 유효성 (정규식)

- 패스워드는 password_1, password_2 두개 필드에서 받은 값을 서로 비교

3. (개발자) 유효성을 확인한 뒤 백엔드 서버로 유저 테이블 데이터 입력 & 이메일 발송 요청을 한다.

4. (유저) 인증 이메일을 확인하여 클릭한다.

5. (서버) 유저 링크를 통해 백엔드 호출하여 기존에 유저 로그인 유효성 여부 (defalut=False) 였던 필드가 True로 바뀐다

5번의 페이지는 UI가 없이 유저가 클릭(호출할 시) 백엔드를 바로 호출하여 검증하고 유효성에 대한 결과값만 alert으로 띄워준다

6. (개발자) 유저가 로그인을 시도할 시 유저 로그인 유효성 여부 필드를 먼저 검증하고

 

 

이후 아이디와 패스워드를 검증하여 최종 로그인을 시킨다

 

 

 

 

 

 

 

⭐️내일 할 것⭐️

 

  • JS CRUD를 공부하고 프로젝트에 적용하기