본문 바로가기
모바일앱 프로젝트

Django 클래스형 view 와 데이터베이스 model

by Nicole 2021. 3. 4.

지난 번에 create 메소드를 views.py 내에 생성해서 딥러닝 코드를 돌렸었다.

그 때 잘 돌아갔었는데, 이상하게도 create 메소드가 호출되면 POST 가 들어왔을 때

사진을 intercept하는 것은 가능한데 (당연히 request를 받을 수 있으니까.)

Mysql 테이블에 데이터가 안 들어간다.

 

아마도 POST 요청이 들어왔을 때 바로 create 메소드로 들어가고, 메소드 이전의 코드인

queryset = Post.objects.all()
serializer_class = PostSerializer

이 부분이 실행이 되지 않는 것 같다.

 

그래서 이참에 클래스형 views에 대해 자세히 찾아보려고 한다.

클래스형 view에 대한 정보는 유투브 영상과, Django rest framework의 공식 문서를 활용했다.

출처는 reference 부분에 기입해 두겠다.

 

우선 내 코드에서 이전에 create 메소드가 작동이 안 되는 이유를 찾았다.

사실 안드로이드에서 보낸 이미지 파일도,

서버 쪽에서 바로 입력한 이미지 데이터도 intercept해서 딥러닝 코드를 돌릴 수는 있는데,

response를 주는 deley가 길어지면 Mysql 과 안드로이드 쪽에서 fail처리를 해버린다.

네트워크가 끊기거나 도달하지 않았다고 판단을 해버린다.

 

그래서 지금 새로 시도하려고 하는 부분은,

create 메소드에서는 이미지 파일만 intercept하고

이미지 처리를 하는 부분은 multithreading으로 따로 처리를 해보려고 한다.

우선 딥러닝 코드가 문제가 아닌 점은 찾았기 때문에 이렇게 시도를 해보면 될 것 같다.

 

1) views.py의 Django 내에서의 역할

views는 HTTP 요청을 처리하는 부분이다. 그렇기 때문에 create와 같은 메소드를 통해 request를 파라미터 값으로 받고 처리하는 것이 맞다.

 

 

2) create 메소드 안에서 db 테이블 값 넣기

create 메소드를 사용하는 순간 별도로 테이블에 값을 넣어줘야 하는 것을 알았다.

딥러닝 코드 부분을 돌리지 않아도 테이블에 값이 들어가지 않음을 확인했기 때문이다.

그래서 데이터베이스 테이블에 바로 값을 넣어줄 수 있는 방법을 찾았다.

Subs = Post.objects.create(title=file_name, image=file_url)
Subs.save()

기존의 queryset = Post.objects.all() 코드가 데이터베이스 테이블과 관련 있는 코드임을 생각해보면 title과 image 값을 받아서 데이터베이스에 save 메소드를 호출해 넣는 것을 볼 수 있다.

이로서 create 내에서 mysql 테이블에 값을 추가할 수 있게 되었다.

 

 

3) 안드로이드 response delay

안드로이드에서 이미지를 보내고 딥러닝 코드로 이미지 처리를 하는 시간이 길어서 안드로이드가 계속 response 값을 못 받는 것으로 인식했다.

이는 multithread를 사용해서 처리했다.

메인 thread 에서는 이미지만 받아서 DB 에 저장하고 바로 response를 보낼 수 있도록 했고,

create 메소드 내에서 이미지를 처리하는 새로운 thread를 만들었다.

생각보다 간단하게 구현이 됐다!

import threading

thread = threading.Thread(target=self.hiya, args=())
thread.daemon = True
thread.start()

 

 

4) media 폴더에 처리된 이미지 넣기

기본적으로 media 폴더에는 안드로이드에서 POST 한 이미지가 들어가게 되어있는데,

이 폴더를 안드로이드에서 이미지 뿌리는 데이터베이스로 사용하기 위해서 약간의 조정이 필요하다.

temp 이미지 파일이 들어가는 폴더는 image로 하고, 매번 같은 이름으로 POST해서 image 폴더에 데이터가 계속 늘어나지 않고, 최대 이미지 하나만 있도록 구현했다.

 

그리고 딥러닝 코드에서 MASK 이미지와 배경 제거된 이미지가 media 폴더로 들어오도록 조정했다.

그런데 혹시나 같은 이름의 이미지가 들어올 때를 대비해서 랜덤한 5자리수 문자열을 만들어서 이미지 이름을 바꿔 저장하려고 한다.

import random
import string

...

letters = string.ascii_lowercase
file_url = ''.join(random.choice(letters) for i in range(5)) + '.png'

그에 따라 커맨드로 딥러닝 코드를 돌리는 부분에도 argument를 넣어줘야 했다.

os.system('python C:/Users/sewon/django_test/mytestsite/bg_removal/u2net_test.py ' + new_name)

그리고 딥러닝 코드의 main 함수에서는 

new_filename = sys.argv[1]

이런 식으로 인자 값을 받아서 사용할 수 있다.

 

 

오늘은 지난 학기 네트워크 시간에 유용하게 사용했던 threading과 기타 지식들을 활용해서 할당량을 빠르게 끝낼 수 있었다.

넘 뿌듯하고 기분이 좋았다.

내일은 이미지 naming 한 번 더 검토하고 다음주, 디비에서 이미지 가져와서 안드로이드 프론트에 뿌리는 부분을 구현해야겠다.

아 그리고 다음주는 중간보고서 제출하기 전에 교수님께 미리 컨펌 받아야겠다.

가즈아!! 아자아자!

 

 

 

REFERENCE

1. Django rest framework modelviewset 클래스 공식 문서

www.django-rest-framework.org/api-guide/viewsets/#modelviewset

 

Viewsets - Django REST framework

viewsets.py After routing has determined which controller to use for a request, your controller is responsible for making sense of the request and producing the appropriate output. — Ruby on Rails Documentation Django REST framework allows you to combine

www.django-rest-framework.org

한국어 번역 버전

velog.io/@swhybein/django-queryset

 

 

2. 직접적으로 관련있진 않았지만, queryset에 대한 상세한 설명. 추후에 활용할 수 있을 것 같다.

mysql 쿼리와 동등한 역할을 하는 django 코드들의 예시. filter, all, exclude 등 

velog.io/@swhybein/django-queryset

 

 

3. Class-based view (CBV) 관련 Django document

docs.djangoproject.com/en/3.1/topics/class-based-views/mixins/

댓글